周记(From 2016/08/09 to 2016/08/16)

我打算每一周写一个周记,具体到每一天。
为什么不写日记呢QAQ
因为日记要新建好多文章呀QAQ


Day0

表示今天犯了很多自己以前的错误呢QAQ
颓了一天QAQ
应该说颓废就是在倒退吧……
写了四道USACO的金组题。。。
然而noip的模拟题也只是嘴巴了一下。
我的这周的打算是这样的。
看到hzwer那里有几套noip模拟题。
打算下午把它们都写一下。
嗯……所以不能再颓废了呀QAQ
好多人感觉都死在了平时的放松上QAQ
应该说平时放松是可行的,但是还是要找到正确的放松姿势吧。
比如说就不能玩有毒的游戏什么的
今天题目也简略的写一些总结吧QAQ
首先是关于DP方面:
数位dp的话实际上关乎每个状态的值的就只有长度和(某位数字等奥妙重重的东西上)。
我们考虑一下记忆化搜索的话,每次dfs记录的状态就是dfs(len,st,flag)。
f[len][st] 表示的含义是,在长度为len,关乎答案的状态为st时,剩下几位任意选的值。
len表示当前在第几位。
st代表当前dp的状态。
flag表示接下来的dp可不可以任意去确定。
也就是之前的位是不是最高位。
记忆化搜索即可。
其次是关于计算几何方面:
极角排序……?
我们考虑这样进行极角排序,首先分象限进行讨论。
然后按照一二三四排序,再使得同一象限的叉积>0,就满足了逆时针的极角排序了。
另外是最短路径树:
实际上,在S->T的最短路径上的每一个点i,S ->i的路径被S->T的路径所包含。
这是显然的。
那么我们对于每一个点u,都可以找出它在S->u的最短路的前驱。
这样的结构,如果说最短路是唯一的,那么显然是树结构。
似乎没啥用,但是可以先做下USACO上的某一个神题?
最后要说一下关于单调队列的问题:
1.首先插入的顺序是升序的,那么从队头到队尾的元素下标就是升序的。
2.队头在更新的时候,要把不符合要求的元素去掉。
3.在插入一个元素A时,如果队尾元素比A差,那么直接去掉队尾然后继续判断。
似乎也没啥可说的。
然后Day0就可以愉快地度过了。QAQ
有一种把时间预支出去的感觉了呢。。。
总之要加油的。


Day1

想起了昨天的题。
题意:给定n条直线和一个圆心在原点上的圆,求相交于圆内的直线的对数。
我们可以转化一下问题,用圆上的两点表示过这个圆的一条直线,那么两条直线在圆内相交,当且仅当它们的劣弧(或者优弧)相交且不包含。
我们按照极角对这些点排序,就可以得到圆上按顺序的所有点。
注明每个点是属于哪条直线的,那么实际上可以看成括号序列。
这样的话就是求一个括号序列里面每个左右括号内的左括号的对数,用树状数组完成即可。


上面这个题是经典的套路,我们把直线在一个圆上的问题就可以转化成区间的问题。


然后谈一下今天上午的noip模拟赛是怎么挂的。。
1.i和j写反可以调半个小时。
2.数组开小。
3.有负数的时候不进行权值负数的判断。
4.做下标(加)减法的时候算错/溢出。
5.手速慢。
6.打错文件名。
这个感觉自己问题其实还是挺大的,但是也算是吸取了很多教训吧。肯定不可以死磕一道题啊QAQ
表示自己还是很讨厌做noip模拟赛的。
因为自己莫名都会炸掉一些题目。。
今天400的题其实是很稳的吧。
我来随便说下今天最后一题吧。
怎么说呢,最后一题其实还是比较简单的,但是计数问题毕竟不是特别熟。


题意:n个格子有的格子未知,有的格子已经种了胡萝卜,有的格子已经种了土豆。
已知有m段连续的土豆,第 i 段的长度恰好为ai,两段土豆之间至少要隔着一个萝卜。求满足条件的方案数。
题解:我们考虑土豆的终点集合 r1,r2,...,rm ,两个方案不同当且仅当终点集合不相等。那么我们就可以dp求方案数了。
f[i][j] 为到第 i 个格子已经填满了j段的方案数。
if(s[i] is not a potato)thenf[i][j]=f[i1][j];
if(s[i] is not a carrot & [iaj+1,i] & s[iaj] is not a potato)
      thenf[i][j]+=f[iaj1][j1];
这题随便注意下细节就应该没问题了吧。
收获:关注两种方案的不同之处,这样可以得出dp的方程。
其实根本不用在意这个点是不是中间点。


还有比较经典的两个CF的题。
但是主要先说下隔板法:
Q:把n个小球放到p个杯子里,必须每个杯子至少放一个,有几种放法?
这样的话我们可以认为n - 1块可以放板子的地方,一共能放p - 1个板子(因为要分成p份).
答案就是C(n - 1,p),即从n - 1个里面选p - 1个的方案数。
Next Question:把n个小球放在p个杯子里,可以有杯子不放球,有几种放法。
答案是:C(n + p - 1,p - 1)。
我们可以在n个球里加入p个球,这样每次求出的球数至少就有1个,然后每个杯子的球实际上都比之前多了1,我们可以认为是 xi=m 的所有非负整数解的集合总数,那么我们把它变形成 [yi]=m+n(yi=xi+1>0) 的正整数解的总数。
那么这个显然就是C(n + m - 1,m - 1)。
但是实际上这种解法不如直接乘法原理来得简单……?
考虑实际上是一个逐个插入板子的过程,那么我们第一次的方案是(n + 1),第二个的方案是(n+ 2)……
ans=(n+m1)!/(mn+1)!
但是考虑到板子的插入是组合而不是排列,所以我们要再除以一个排列数。
ans=(n+m1)!/((mn+1)!(p1)!)
这是一个赤裸裸的组合数呀同学们(敲黑板)。
CF的两道题想法很多啊QAQ


今天做的一个野鸡dp题居然卡住了?
题意:将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”。问在所有排列中,有多少个排列恰好有k个“<”。答案对2012取模。
一开始想的做法是 f[i][j]ij ,发现不行,所以改成 f[i][j]1 ij
那么这题就变水了。。
放在小于号那个位置,那么小于号不变,大于号+1.
放在大于号那个位置,那么大于号不变,小于号+1.
放在最左边,小于号不变,大于号+1.
放在最右边,大于号不变,大于号+1.
经验:
见到排列进行枚举的话,可以先从1~i的数字入手,而不是从下标入手。
感觉自己和智障已经没区别了。


你驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞过n个星球。

星球笼统的分为2类:资源型和维修型。(p为钻头当前能力值)
1.资源型:含矿物质量a[i],若选择开采,则得到 a[i]p 的金钱,之后钻头损耗k%,即 p=p(10.01k)
2.维修型:维护费用 b[i] ,若选择维修,则支付 b[i]p 的金钱,之后钻头修复 c ,即 p=p(1+0.01c)
注:维修后钻头的能力值可以超过初始值(你可以认为是翻修+升级)
最大化收入。


这个题如果被我当作是神题了会不会被打啊QAQ
我们考虑参考系,即把初始钻头的耐久度变成1,那么最终的答案只需要乘一下w即可。
我们考虑这个肯定是个dp。
f[i]i
我们发现正着搞不太好搞.
那么反着来
考虑 f[i] 表示i~n的最大价值,且把第i个星球的钻头耐久度看作1.
那么如果i是消耗星球: f[i]=max{f[i+1](1k)+a[i],f[i+1]}
那么如果i是修复星球: f[i]=max{f[i+1](1+c)b[i],f[i+1]}
然后最后答案就是w * f[1]。

经验是这样的:
1.在有百分点的下降这种事情发生时,可以考虑参考系的设置。
2.其实dp的话完全是可以……先想倒着好不好来。这样就不太容易掉坑……(或许?)


应该说还是要回去学学数学什么的,感觉上我很需要在一个月的时间内毕业完高二数学物理什么的(首先要有书啊喂)。
这个感觉flag可以立,回去做一下计划,将在本周最末发出。
我们最近需要回顾下数论函数和组合数学的方面了。


做一下今天的总结吧,感觉上讲今天挂得很惨。
本来都想……如果noip挂了就退役算了。
但是想想,本来人就要中二一点,还是要相信自己挂着个主角光环什么的。
还是不要退OI保平安的好。
感觉上对于数学和DP的话,自己还是太弱,可以去hzwer的博客上翻dp去做,这点还是感觉很滋磁的QAQ
另外就是文化课方面真的有点吃紧,必须要复习一下
优先学习的是高二的数学和物理,打算刷满练习册,然后就不去听课了。
生物和化学只跟文化课进度走就好了,其实就是这两科挺累赘的啊。。
我今天忽然也意识到了自己吧。
1.信心不足,实力不够还期望太高。
2.看不到自己的进步速度。
但是……
无论如何,我们都要勇敢地走下去。

明天还有一场noip的模拟赛,赛前看一些题吧。
还可以每天推荐歌曲感觉还是很滋磁的QAQ
(第一次推荐)今天的歌曲是STYX HELIX,它是一首日文歌。
感觉这是我听过的最好的ed了吧QAQ
番名:《Re:从零开始异世界生活》


Day2

啊noip模拟赛300炸100.
原因是交了一个乱七八糟的程序上去而没有交标算。
没交标算的原因很简单:“我对拍过了。”
对拍的前提是要看看你的对拍程序对不对呀TAT
要看数据造的对不对呀TAT
涨姿势*1
如果说最近练的这些题有没有意义的话……
可能只是反省作用吧。
给我的感觉就是自己的代码准确度还是不够高。
可以做CF去提升的,而且hzwer的blog里模拟赛应该质量还算很高的。



Day3

有一种Day3什么也没有做的感觉。
因为Day3上午是大家的经验总结+做题。
下午是开一个大概问卷调查的东西。
其实总结还是很有必要的<没错比如我的周记。>
但是感觉给低年级小盆友去说自己的经验或者如何如何的话。
其实是没有用的吧。
坑只有自己踩实了才知道如何掉进去的吧。
其实讲些题倒是不错,自己也讲了一些。
刷的noip模拟赛也不算少了吧。
但是每套都不能AK。
而且。为什么现场赛的成绩总是那么差呢……
每次比赛感觉到最后自己的呼吸都带着血的吧……
比赛的过程中整个身体都是冰冷的……
紧张么……?
应该是紧张的吧。因为赢了不能代表什么,而输了代价太大。


简单题简单写。复杂题。
你说复杂题……?
NOIP有复杂题?
说真的……如果考一些图论题真的会跪掉吧。


Day4

知道自己图论弱还不练的后果*inf。
NOIP模拟赛又跪。
自己是很弱,也很失败的吧。
可是……
感觉自己确实脑残。但是又没办法去更改的事情真是痛苦。
T1贪心显然,但是起点选错,然后爆炸。
T2完全是在想部分分,其实标算是很显然的吧。
T3讲真,50分可以用RMQproblem的线段树写。
然而问题是,tm那么显然的一个单调我没发现233333
于是区间覆盖->区间取min。
愉快爆炸。


表示自己如果知道怎么做的话,就真的不会这样了。
刷了几套NOIP的模拟赛,思路也都是有的,而且和标算是相同的。
感觉题可以分为3种:
1.一眼。
2.不会做的。
3.想想不会做的。
像这一天的三道题其实是属于略微想一想就能做的,但是问题就在于想的过程。
说真的自己都去YY块状树了:)
表示自己每次挂了之后都会记录下自己怎么挂的。
感觉不失误的前提条件是实力要达到那个点,而我现在显然没有到达那种程度。
多去想一些题,应该问题就解决了吧。
任何不能毁灭你的东西终究会使你更加强大。
我会一直努力下去,因为还没有到尘埃落地的时刻。


Day5

于是今天又比了一场noip提高组的比赛。
用100分的代价来学习了怎么写dfs版的spfa真是开心。
T1是pkusc的那个polya计数。
T2是一个Tarjan裸题。
补充重建DAG的代码:

void Build()
{
    Rep(x,n)
    {
        RepG(i,x)
        {
            if(bel[v] != bel[x])
            {
                save(bel[x],bel[v]);
                rd[v] ++;
            }
        }
    }
}

T3.分数规划裸题。
用spfa求负环,然而自己脑残把dfs版本的写错。
好菜啊好菜啊好菜啊好菜啊
不过没关系,至少还不是一无所获,起码自己会写dfs版本的了。


晚上做了一些tg的有趣<水>题,感觉自己的想法真是喜欢走远。
1.给定n个点的坐标,你可以选择m个点把它们免费连起来。求联通所有的点的最大代价的最小值。连接一条边的代价定义为其欧几里得距离。
n,m <= 300
(话说一开始我都开始想怎么二份答案+费用流了2333
T.T说起来这个东西都是显然的……
连通性:并查集&&最小生成树
正确解法其实是这样的:
首先我们考虑这个边肯定在最小生成树上。
而且答案不会超过最小生成树最大的边。
这样我们考虑如果我们只能选1个点,那么实际上答案就是第(n - 1)小。
能选两个点,答案就是(n - 2)小。
能选三个点,答案是(n - 3)小。
也就是说,我们如果能选m个边,那么我们最小生成树有效的边只需要选n - 1 - m条即可。
(这种题解还要写得这么详细。。。)


2.给一张混合图,把无向边重定向之后变成DAG。
这个拓扑排序应该是能想到的。
1.首先有向边都加进去之后是DAG。
2.按照入度进行拓扑排序。
3.得到拓扑序列之后,加入无向边(a,b)。
如果tid[a] < tid[b],则加(a,b)。
否则加(b,a)。


3.差分约束系统
没错题目就是查分约束的裸题。
想不到我会写在周记里吧233333333333333333
题意是:
给定3种关系,问是否有可行解。
1.d[a] - d[b] >= c
2.d[a] - d[b] <= c
3.d[a] = d[b]
化简:
1.d[b] <= d[a] - c
2.d[a] <= d[b] + c
3. d[a] <= d[b] + 0,d[b] <= d[a] + 0
dis[v] <= dis[x] + edge[i].w
等等好像有什么奇怪的东西混了进来
我们发现最短路的形式其实也是这样的。
假如d[a] <= d[b] + c(即第2个约束)
那么我们实际上加入边(b,a,c)就可以了。
我们建立原点s,d[s]的值显然是0。
建立(s,i,0)之后跑spfa的话就能知道一组可行解。
可行解就是每个值的dis值。
如果不可行那么一定会出现负环。
dfs版的spfa算就好了。


补充dfs版的spfa代码:

void spfa(int x)
{
    RepG(i,x)
    {
        if(dis[v] > dis[x] + edge[i].w)
        {
            if(!vis[v])vis[v] = 1,spfa(v);
            else return (void)(flag = 1);
        }
    }
    vis[x] = 0;
}

注意一件事情:跑多次判断负环的时候要清空vis数组。


Day6
今天比了一场noip的模拟赛感觉还算凑合(组合数都质疑自己的做法233)
题意等睡好了再说吧。
先说下不带修改区间众数。
这个可以分块。
定义f_i_j代表以 i j的众数。
我们考虑开个map然后用i去扫整个序列。
当到了第i块的时候,我们把第i块的元素按顺序丢到map里面。
然后我们每次丢一个元素就看看这个是不是众数。
到第i + 1块的时候显然f[i][i + 1]是可以计算的,你只需要继续用之前的map然后丢i +1的元素进去就行了。
询问的时候显然 f[i][j] 可以带来一个贡献,那么我们枚举不在块内的那一段的所有数的数值。按照数值(离散值)开vector,保存元素x的出现位置集合。
我们二分l和r的位置,看里面有几个就行了。
然后我睡觉了。


Day7
今天NOIP模拟赛……
明显可加减性质的可以用树状数组维护的东西……
我生生写了个Treap还调不出来……
代码能力真是差QAQ
另外带权并查集也写挂了……
真是服了我自己。
什么都可以花式写挂,可以,这是我的一贯风格。


不过考试的时候拍了十分钟忽然WA掉的Treap,感觉自己心态当时直接炸了……
T.T
一定要写好平衡树啊TAT


不过说回来长了一些知识。
有一个01串S,你需要把S划分成几段,求每段的0和1的差值的绝对值小于等于k的方案数。


朴素算法:
f[i]=f[k](check(k,i))
考虑一个问题,k和i之间的01串实际上我们不必知道有多少。
我们考虑用 sumi 记录1到i的0的数量-1的数量。
那么我们知道了:
abs(sumisumj)<=K 的时候我们就可以结算贡献了。
也就是说:
我们要结算的贡献是: [sumiK,sumi+K] 这一段。
用树状数组维护即可。

前缀偏移量这种思想是很重要的QAQ


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值