省选/NOI刷题Day2

bzoj2616 放一个车的时候相当于剪掉棋盘的一行,于是就可以转移了,中间状态转移dp套dp,推一下即可

bzoj2878 环套树期望dp 手推一下递推式即可

bzoj3295 树状数组套权值线段树

NOI2002贪吃的九头龙 多叉转二叉 水过

bzoj1495 方程就是f[i,j,k]表示以i为根,叶节点有jA,所有的父节点状态为k的最佳值,然后方程就出来了f[i,j,k] = min(Σf[son,j1,k1]),其中Σj1=jk1k加上i的状态。然后把后两维用一个数压一下保存就好了...奇怪的状压

hdu1561 有树状依赖的背包问题...写起来很奇怪

清华集训2015 V 线段树裸题

uoj #48 分类讨论O(1)题

uoj #67 Tarjan找割点,删掉不是割点的点使图满足条件就好了

ZJOI2016 线段树 

     题意就是求每个数在所有方案中的最终值的和。显然一个数经过若干次变化一定会变成另外一个数,那么离散化后,令g[i][j]表示i这个数最终变成从小到大第j个的方案数。一个直观的思路是,我们枚举j,那么显然g[i][j]>0的i的范围是(l,r),其中a[l]和a[r]是第j大的数两侧分别第一个大于这个从小到大第j个数的数(由于是随机因此可以假定没有两个数相同)。此时,

       如果令f[k][x][y]表示经过k轮后,恰好是[x,y]这个范围内的数都变成了从小到大第j个数的方案数。但是这样会存在问题,就是如果某一轮的操作跨过了l或r,就会造成[l,r]中某一些数>从小到大第j个数,这样再转移就会出错。

       那么(根据jry老司机的博客)令f[k][x][y]表示经过k轮后,恰好[x,y]这个范围内的数都<=从小到大第j数的方案数,这样就可以转移了。显然f[k][x][y]必然由f[k][u(u<x)][y]和f[k][x][v(v>y)],然后操作任意[t(t<l),u]和[v,t(t>r)]得到;或者直接由f[k][x][y],然后任意一个操作[u,v],其中[u,v]∩[x,y]=0得到。

       然后重新领g[i][j]表示第i个数最终<=从小到大第j个数的方案数,然后减一减即可。

       后来有一个卡常的技巧是每一轮都用long long暴力加起来,这一轮结束的时候再取模。这样瞬间应该可以快很多。

posted @ 2017-12-20 15:35  探险家Mr.H  阅读(189)  评论(0编辑  收藏  举报