摘要: 参考:https://www.cnblogs.com/2016gdgzoi509/p/8999460.html 列出生成函数方程,g(x)是价值x的个数 $$ f(x)=g(x) f^2(x)+1 $$ +1是f[0]=1 根据公式解出 $$ f(x)=\frac{1+( )\sqrt{1 4 g(阅读全文
posted @ 2019-01-19 10:34 lokiii 阅读(5) 评论(0) 编辑
该文被密码保护。
posted @ 2019-01-18 09:22 lokiii 阅读(1) 评论(0) 编辑
摘要: 并不会递推,不过板子挺好背的,只要是类似的递推都能用,但是注意c数组不能使负数 如果除了递推还有常数项的话,就用f[i] f[i 1]的方式消掉常数项(然后多一个f[i 1]的项) cpp include include include include using namespace std; co阅读全文
posted @ 2019-01-16 11:04 lokiii 阅读(1) 评论(0) 编辑
该文被密码保护。
posted @ 2019-01-16 10:32 lokiii 阅读(1) 评论(0) 编辑
该文被密码保护。
posted @ 2019-01-12 22:08 lokiii 阅读(1) 评论(0) 编辑
该文被密码保护。
posted @ 2019-01-11 22:14 lokiii 阅读(2) 评论(0) 编辑
该文被密码保护。
posted @ 2019-01-10 22:02 lokiii 阅读(3) 评论(0) 编辑
摘要: 一开始设计了四种状态,多了一种已经拐弯但是长度为0的情况,后来发现不用,设012表示没插头,没拐弯的插头,拐了弯的插头,然后转移的话12,21,22都不合法,剩下的转移脑补一下即可,ans只能在11,02,20取,别的都不是合法结束状态阅读全文
posted @ 2019-01-04 08:02 lokiii 阅读(8) 评论(0) 编辑
该文被密码保护。
posted @ 2018-12-20 20:13 lokiii 阅读(1) 评论(0) 编辑
摘要: 要判边界!!要判边界!!要判边界!!if(j!=m)!!! 我真是zz横着转移要判断到底能不能向右边出边…… 然后剩下的和1814差不多,九十因为不要求经过所有格子,所以左右括号随时可以合并,但是注意合并的时候轮廓线上不能有别的括号,然后还有是(0,0)可以转移到(0,0),相当一不经过这个格子阅读全文
posted @ 2018-12-14 21:57 lokiii 阅读(11) 评论(0) 编辑
摘要: 设f[i][j][s]为轮廓线推到格子(i,j),状态为s的方案数 括号表示一段线的左端和右端,表示成左括号和右括号,状压的时候用1和2表示,0表示已经闭合 下面的蓝线是黄色格子的轮廓线,dp转移要把它转到橙色轮廓线,设已经在状压的s中取到两条边的状态记为b1,b2 然后分很多情况讨论: (i,j)阅读全文
posted @ 2018-12-14 08:44 lokiii 阅读(12) 评论(0) 编辑
摘要: 统计在一个root下的两个子树,每个子树都和前面的运算一下再加进去对于这种需要排序的运算很麻烦,所以考虑先不去同子树内点对的算出合法点对个数,然后减去每一棵子树内的合法点对(它们实际上是不合法的,相当于一个容斥) 算点对用排序+双指针即可 cpp include include include us阅读全文
posted @ 2018-12-11 21:43 lokiii 阅读(11) 评论(0) 编辑
摘要: 点分治,用一个mn[v]数组记录当前root下长为v的链的最小深度,每次新加一个儿子的时候都在原来儿子更新过的mn数组里更新ans(也就是查一下mn[m dis[p]]+de[p]) 这里注意更新和初始化的时候不能对整个mn操作,这样时间复杂度是错的,要开一个栈存一下更新了哪些点,只初始化这些点即可阅读全文
posted @ 2018-12-11 18:38 lokiii 阅读(7) 评论(0) 编辑
摘要: 点分治,设当前处理的块的重心为rt,预处理出每个子树中f[v][0/1]表示组合出、没组合出一对值v的链数(从当前儿子出发的链),能组合出一对v值就是可以有一个休息点 然后对于rt,经过rt且合法的路径是两边拼起来至少有一个休息点的路径,每次假如新儿子都和之前的儿子组合一遍即可,注意f[0][0]实阅读全文
posted @ 2018-12-11 16:32 lokiii 阅读(4) 评论(0) 编辑
摘要: 和3053差不多,把pair first做成负数就可以用大根堆维护了 注意:要开long long;比较的时候因为编号也占权重所以要比较pair;编号不是mid!不是mid!是初始输入的那个编号!~~搞混调了很久~~ cpp include include include include inclu阅读全文
posted @ 2018-12-11 09:06 lokiii 阅读(6) 评论(0) 编辑
摘要: 多维KDtree板子 左右儿子的估价用mn~mx当区间,假设区间里的数都存在;k维轮着做割点 cpp include include include include include include using namespace std; const int N=50005; int n,k,m,r阅读全文
posted @ 2018-12-10 20:41 lokiii 阅读(5) 评论(0) 编辑
摘要: 其实理论上cdq更优 核心是依次取x值、y值的mid作为当前节点,向两边递归建立二叉树,树上维护size:子树大小;mx[0/1]:子树内最大x/y;mn[0/1]:子树内最小x/y;d[0/1]:这个点的x/y; 建树的时候用到nth_element,用处是把第k个数放到k位置,并且把小于k的放在阅读全文
posted @ 2018-12-10 19:04 lokiii 阅读(6) 评论(0) 编辑
摘要: 不太清楚是不是动态dp……? 这个维护其实和最大连续子段差不多,维护l[x][y],r[x][y],m[x][y]分别表示包含左儿子的01个数为(x,y)的区间个数,包含右儿子的01个数为(x,y)的区间个数,和01个数为(x,y)的所有区间个数 x表示1的个数情况,0表示0个,1表示1个,2表示 阅读全文
posted @ 2018-12-10 07:57 lokiii 阅读(7) 评论(0) 编辑
摘要: 参考:https://www.cnblogs.com/CQzhangyu/p/8632904.html 要开longlong的 首先看dp,设f[u]为必选u点的子树内最大联通块,p[u]为不一定选u的子树内最大联通块,转移很显然就是f[u]=max(Σf[v],0),p[u]=max(max(p[阅读全文
posted @ 2018-12-09 11:55 lokiii 阅读(16) 评论(0) 编辑
摘要: 是动态dp的板子 大致思想就是用g[u]来表示不包含重链转移的dp值,然后用线段树维护重链,这样线段树的根就相当于这条重链的top的真实dp值 每次修改的时候,修改x点会影响到x到根的真实dp值,但是只会影响到每条重链的低端点的dp值,相当于在log个线段树上单点修改 cpp include inc阅读全文
posted @ 2018-12-08 19:00 lokiii 阅读(7) 评论(0) 编辑
摘要: 一直WA……找了半天错的发现居然是解密那里的mask其实是不能动的……传进去的会变,但是真实的那个不会变…… 然后就是后缀自动机,用LCT维护parent树了……注意不能makeroot,因为自动机的根是不会变的(同理也不能翻转区间),其实就是低配LCT(?) cpp include include阅读全文
posted @ 2018-12-07 10:39 lokiii 阅读(4) 评论(0) 编辑
摘要: 我没有找到能在bzojAC的代码……当然我也WA了……但是我在洛谷过了,那就假装过了吧 minmax线段树一开始写的只能用min更新min,max更新max,实际上是可以互相更新的…… 首先看第二问,注意到因为没有相交,所以可以全都按某种顺序像同一个方向移动来完成游戏,这个顺序通过扫描线找到,用se阅读全文
posted @ 2018-12-06 17:43 lokiii 阅读(16) 评论(0) 编辑
摘要: 我想写FHQtreap的!是set自己跑进代码的!~~因为太好写了~~ 是有点慢……洛谷上不吸氧会T一个点 就是,用一个set p维护所有点值,ans维护MIN_SORT_GAP的答案,每次insert一个点的时候都查一下它在p里的前驱后继,更新一下ans即可;用一个multiset c维护差分后的阅读全文
posted @ 2018-12-05 19:16 lokiii 阅读(7) 评论(0) 编辑
摘要: 就是非旋treap的板子 cpp include include include using namespace std; const int N=500005,mod=73939133,bs=997687623; int q,tot,rt,st=123; struct qwe { int c[2]阅读全文
posted @ 2018-12-05 10:58 lokiii 阅读(5) 评论(0) 编辑
摘要: 首先看出终止状态是全都堆在左边或者右边,然后发现黑的向左白的向右是最优策略(如果不能这样了也就该输了) 然后就不会了 参考 http://www.cnblogs.com/CQzhangyu/p/7707746.html 发现黑白之间的距离一定是不断缩小的,就相当于k堆石子,每次从1~d堆里拿走一些,阅读全文
posted @ 2018-12-04 15:27 lokiii 阅读(6) 评论(0) 编辑
摘要: 先手必胜状态是黑三角在边上 然后其他情况脑补一下,n为偶数先手必胜,可以理解为从某一边取,先手总有办法让后手取得一边有奇数个阅读全文
posted @ 2018-12-04 14:49 lokiii 阅读(3) 评论(0) 编辑
摘要: 这个东西卡常……预处理的时候要先把i%j,i/j都用变量表示,还要把%2变成&1…… 首先每一堆都是不相关子游戏,所以对于每一堆求sg即可 考虑暴力枚举石子数i,分割块数j,分解成子问题求xor和(其实就是根据i/j,i/j+1的个数的奇偶性xor一下即可),然后对sg[i]暴力mex,这样是n^2阅读全文
posted @ 2018-12-04 11:29 lokiii 阅读(4) 评论(0) 编辑
摘要: 先预处理出来sg值,然后先手必败状态就是sg[a[i]]的xor和为0(nim) 如果xor和不为0,那么一定有办法通过一步让xor和为0,具体就是选一个最大的sg[a[i]],把它去成其他sg值的xor和,这样后手的xor和就是0了 当然并不一定要取最大的,只要sg[a[i]] (ans^sg[a阅读全文
posted @ 2018-12-04 09:20 lokiii 阅读(4) 评论(0) 编辑
摘要: 必败状态是倒序排列,也就是正序对为0 然后发现,每次翻转都是有奇数个数对(\\( C_{4x+2}^{2} C_{4x+3}^{2} \\) 都是奇数),所以每次翻转丢回改变正反数对的奇偶性 又因为偶数为必败状态,所以顺序对为奇数则必胜 cpp include include using names阅读全文
posted @ 2018-12-04 08:24 lokiii 阅读(9) 评论(0) 编辑
摘要: 必败状态是n为偶数并且数量相同的石子堆可以两两配对,因为这样后手可以模仿先手操作 其他状态一定可以由先手给后手一步拼出一个必败状态(用最大堆补) cpp include include include using namespace std; const int N=100005; int n,a[阅读全文
posted @ 2018-12-03 21:50 lokiii 阅读(3) 评论(0) 编辑