摘要:
线段树好题。很容易求出要维护的东西的公式,给线段标号,设x,y为左右线段标号,那么其中出现的总和就是Σc[i]*((i-x)*(y-i)+(y-x)),拆开就是Σ(y-x-y*x)*c[i]+(x+y)*i*c[i]-i2*c[i].于是只要维护∑c[i],∑i*c[i],∑i2*c[i]就行了。我一开始想偷懒写bit发现用了bit以后维护的和会升至3维,(⊙o⊙)…三维求和,略难搞,只好放弃。那么就是线段树,用一个求和公式就行了。看来以后要多练练线段树了,实在是偷懒偷的太多了......road 1 #include<iostream> 2 #include<cstdio& 阅读全文
摘要:
状压DP。f[i][s]表示第i个车站之前的p位的状态为s的方案数,注意这里状态s我们规定第一位为1,并且一共有k个1。这样的话状态一共有C(9,4)=126种,于是设计一个126*126的矩阵,自乘n-m次就可以了;初始状态:11111(m个1)的状态;目标状态:11111(m个1)的状态。bus 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #define maxn 1200 阅读全文
摘要:
bzoj崩了3天了......本人目前处在无题可交的状态,郁闷啊。不过TY复活了,看到以前写过的代码有点小激动。切入正题,这个题想了好久才写,主体还是分治,只是中间处理部分比较巧妙。这个题GYZ在wc上讲过,思路也很清晰,就是不太好写。过程主要分两个部分(我直接粘解题报告了):1. Contraction 把 L..R要修改的所有边权暂时标记为-∞; 对图做 MST; 此时观察图中不是-∞但被选入 MST的边集; 它们在 L..R的询问中也一定会被选入; 于是可以直接先用这些边把点集做合并操作。这样图的点数被缩小; 还原边权标记. 2. Reduction 把 L..R要修改的所有边权暂时标. 阅读全文
摘要:
这篇题解拖了好久......原因是一直不知道该怎么叙述。首先,类似采花那个题,统计答案的时候要找到每个位置之前和它颜色相同的第一个位置pre[i],那么只要这个位置的pre[i]不在查询的[L,R]区间里,就说明这个颜色是这个区间里第一次出现的颜色,答案+1。动态修改的话我们可以用set来实现。然后传统的树套树做法是将序列建一棵线段树,再给线段树每个节点建一棵平衡树,代表[l,r]这段区间。那么每次查询[L,R]的时候在线段树上走一下,找到相应位置,查找比询问L小的有多少个就行了。但是有一种更为简洁的做法——整体二分!以前都是用整体二分去搞一些第k小数问题,但这个题其实和第k小数有很大的联系: 阅读全文
摘要:
这个题是在GYZ冬令营讲课课件里翻出来的,所以我一开始使劲地往分治上去想,良久,无果··········题意是给你一圈位置,位置上有若干颜色(可以重复),每个颜色有一个需求量,每一个时间给一个段加上一个数,最后问每个颜色最早加到需求量的时间。今天早晨睡觉起来(大概是10点多),赖在床上,YY这个题,突然想到整体二分然后计算贡献似乎非常不错。但是对于序列的处理怎么搞才能把复杂度降下来呢?于是我想到用链表记录每个颜色的位置,这样计算均摊下来就是O(m)了,用树状数组处理,外面套一个整体二分,似乎是非 阅读全文
摘要:
貌似是个傻×题啊.......由于贪心地想要刷双,结果被空间卡了半个小时。这个题是问字符串S每一位的最短识别子串是多长(识别子串指包含这个字符且只出现在S中一次的子串)。为了想这个题,我对着SAM的图YY了一天。终于,我发现,从后缀树的角度考虑是比较简单的。因为SAM是一棵逆序的后缀树,那么每一位i的前缀(除了包含在别的前缀里面)所对应的节点一定是后缀树里的叶子节点。那么我们只要找到它的父亲节点,然后它的父亲节点对应的子串填上一位字符就是一个识别子串。然后我们就求出了每一位往前最短的识别子串的长度(比这个长度长的一定是识别子串)。然后,我们看:其中L~R是最短识别字串1~L-1段,可 阅读全文
摘要:
算是正式开始接触期望DP了吧,以前在NOIP之前TY比赛里做过一些,基本上都是根据初中的概率知识乱搞的,但事实上这种期望概率动规题还是可以很难的。这个题是看论文上的题解,算是比较基础的期望dp了吧。首先需要预处理一些东西:way[i][j]表示聪聪在i可可在j点时聪聪会走到哪个点,t[i]表示i点的度,next[i][j]表示和i点相连的第j个点是谁(就是可可在i点时可以走到的点的集合,这个集合的大小是t[i])。其中way[i][j]我是枚举顶点dfs的。然后就是一个方程了:f[i][j]=f[way[way[i][j]][j],j](可可不动)+Σf[way[way[i][j]][j],n 阅读全文
摘要:
首先如果没做过维护序列这个题的可以先去做一下,对标记有个初步理解,题解在这里。看到了一道LCT练手题,于是果断刷了,这个题主要恶心在传标记上,别的都是基本的LCT操作。那么我就说一下传标吧。链接一个博客Kanari's World这里面讲的不错,下面我只说说我的体会。我习惯把所有的标记在一个过程里下传,下传顺序一般是旋转,覆盖,加减,注意如果有覆盖的话,连同加减都要一起清掉。然后我下传一般只写在splay的开头,就是先上溯找到根,然后递归地把标记一个一个传下来,事实证明这样做和在旋转的时候一个一个down下来是一样的。然后是标记法则,这个很重要!一定要规定一个严格的标记法则,就是什么优 阅读全文
摘要:
zjoi2013的题终于做完了,拖了好久,觉得这份题质量挺高的,而且代码量都不是很大,zj的题还是比较注重思路的,而且都可以有不同的解法,甚至可以骗分= =。这个题我一开始只能想出N^4的,后来参考某神的题解发现我多出来的那一维完全是没有用的......但是我还是想总结一下思路,毕竟这种2D的DP做的比较少,以免以后忘掉。首先经过一些列的简化我们发现这个题实际就是求个凹凸不平的形状中的最大值,也就是一堆高度参差不齐的子矩形的和,这些子矩阵同底,高满足一高一低,一共要这样变2k次,也就是一共有2*k+1个矩形。设f[i][j][k][h]表示以[i][j]为右下角的子矩阵,是当前的第k个子矩阵, 阅读全文
摘要:
后缀自动机......慢慢体会ing。这个题的题意是给你一堆数字串,让你去重以后问所有字串代表的数字的和(mod 2012)这个题n是10^6级别的,所以要充分利用重复字串的性质。这么考虑,当有许多子串的都添一个末位数字K时,这些子串的和就是原来字串的和*10+子串个数*k。其实这些字串在自动机里面对应的就是一个状态,当这些状态都存在一个指向Q的转移时,就可以把这些状态的sum累积到Q上。这充分利用SAM自动机中转移函数的特点(tran[p][w]表示在p状态后面添加一个字符w,将成为哪一个状态的后缀)。这样想的话,每一个状态上累加的sum实际上是这个状态所有后缀的sum和,而这些后缀的共同特 阅读全文