上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 29 下一页
摘要: bzoj上访问负下标会跑到奇怪的地方…… 其实可以滚动数组优化,但是我看能过就懒得改了 设f[i][j]为已经算了前i个挂饰,当前有j个空的钩子,转移就是f[i][j]=max(f[i 1][j],f[i 1][max(min(j a[i]+1,n), n)]+b[i]) 注意到只有 n inclu 阅读全文
posted @ 2018-09-12 19:38 lokiii 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 如果确定了第一行,那么可以推出来整个矩阵,矩阵合法的条件是n+1行全是0 所以推出来n+1行和1行的关系,然后用异或高斯消元来解即可 cpp include include using namespace std; const int N=45; int n,m,f[N][N][N],a[N][N] 阅读全文
posted @ 2018-09-12 16:44 lokiii 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 以后写dp还是向后转移吧……写的把前面加起来的版本怎么也调不过去 首先注意,因为地图碎片只占1体积,所以 n, include using namespace std; const int N=405; int n,l,m,a[N]; double p[N],f[2][N][N],ans; int 阅读全文
posted @ 2018-09-12 11:40 lokiii 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 先做最小生成树,这样就保证了最大值最小 然后随便用个什么东西维护一下最大值,我用的树剖log^2,倍增会更快 cpp include include include using namespace std; const int N=100005; int n,m,k,f[N],h[N],cnt,va 阅读全文
posted @ 2018-09-12 09:44 lokiii 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 没考虑可以连着两个不选……直接染色了 实际上是基环森林,对于每棵基环树,dfs找出一个环边,然后断掉这条边,分别对这条边的两端点做一边treedp,取max加进答案里 treedp是设f[u]为选u点,g[u]为不选u点,然后随便转移一下就行了 cpp include include using n 阅读全文
posted @ 2018-09-12 09:08 lokiii 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 原来cerr在bzoj上回RE?! 从高位到低位贪心,注意取01结果相同时取0,这样就可以去掉limit了 cpp include include using namespace std; const int N=100005; int n,m,b[N][35],a[N],tot,ans,mx; c 阅读全文
posted @ 2018-09-11 21:17 lokiii 阅读(156) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2018-09-11 20:53 lokiii 阅读(2) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2018-09-11 20:34 lokiii 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 裸的树链剖分+线段树 但是要注意一个地方……我WA了好几次才发现取完相反数之后max值和min值是要交换的…… cpp include include using namespace std; const int N=200005; int n,m,h[N],cnt,de[N],va[N],fa[N 阅读全文
posted @ 2018-09-10 21:59 lokiii 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 比较基础的数位dp,dfs的时候带上上一位,上上位,是否已经有连续3个相同位,是否有4,是否有8即可 但是要注意两点(在洛谷上一直70) 当l=1e10的时候,直接输出clc(r)即可,因为如果再减去clc(l 1)的话,是会多减掉1的 还有判断前导0 cpp include include usi 阅读全文
posted @ 2018-09-10 19:22 lokiii 阅读(163) 评论(0) 推荐(0) 编辑
摘要: emmm妹想到要倒着推 先假设只在n建一个控制站,这样的费用是\\( \sum_{i=1}^{n} b[i]\ (n i) \\)的 然后设f[i]为在i到n键控制站,并且i一定建一个,能最多节省下的费用,那么显然转移是\\( f[i]=max(f[j]+s[i]\ (j i) a[i]) \\), 阅读全文
posted @ 2018-09-10 16:13 lokiii 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 设f[i]为杀死i的最小代价,显然\\( f[i]=min(k[i],s[i]+\sum f[to]) \\) 但是这个东西有后效性,所以我们使用spfa来做,具体就是每更新一个f[i],就把能被它更新的点重新入队 cpp include include include include using 阅读全文
posted @ 2018-09-10 08:23 lokiii 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 参考了这个http://www.cnblogs.com/Artanis/p/3751644.html,好像比一般方法好写 大概思想就是先计算出把所有石子都合并到1位置的代价,这样显然有一些是不优的,然后再分别计算把合并到1的石子合并到p,能优化多少 这个计算就是枚举2到tot位,对于每一位计算挪到这 阅读全文
posted @ 2018-09-10 07:41 lokiii 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 设f[a][i][j]为第a段时间结束时在(i,j)位置的最长滑行距离,转移很好想,就是分四个方向讨论,然后枚举这段时间的滑行长度取个max即可 但是这样是O(n^4)的,考虑优化 发现同一行或列,取max对应a 1中的是单调挪动的一个区间,所以用单调栈维护当前区间,每次移动的时候要把左端点已经大于 阅读全文
posted @ 2018-09-09 20:09 lokiii 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 设f[i][j]为在坐标(i,j)时的最小点击次数,转移的话从i 1向上飞或者向下掉转移,注意转移完了之后要把管子部分赋值为inf cpp include include using namespace std; const int N=10005,inf=1e9; int n,m,k,p,ans, 阅读全文
posted @ 2018-09-09 17:44 lokiii 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 容斥是ans= 至少k位置相等对数 C(k,k) 至少k+1位置相等对数 C(k+1,k)+至少k+2位置相等对数 C(k+2,k) …… 然后对数的话2^6枚举状态然后用hash表统计即可 至于为什么要乘上一个组合数,详见 https://www.cnblogs.com/candy99/p/661 阅读全文
posted @ 2018-09-09 17:26 lokiii 阅读(155) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2018-09-09 14:47 lokiii 阅读(2) 评论(0) 推荐(0) 编辑
摘要: n ne[n]是n的最长循环节长度,其实就是n 最短前缀=后缀长度 然后我们要求最短循环节,其实就是ne一直往前跳,跳到不能跳为止,这时的n ne[n]就是n的最短循环节长度 cpp include include using namespace std; const int N=1000005; 阅读全文
posted @ 2018-09-08 20:20 lokiii 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 设f[s]为已经 从上到下 叠了状态为s的牛的最大稳定度,转移的话枚举没有在集合里并且强壮度 =当前集合牛重量和的用min(f[s],当前放进去的牛还能承受多种)来更新,高度的话直接看是否有合法集合的高度达到要求即可 cpp include include using namespace std; 阅读全文
posted @ 2018-09-08 19:44 lokiii 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 显然是状压,显然不可能把所有格子压起来 仔细观察发现只有机关周围的四个格子有用以及起点,所以我们用spfa处理出这些格子两两之间的距离(注意细节……这里写挂了好几次),然后设f[s][i]为碰完的机关石状态为s,现在在有用格子的第i个的最小停下次数,转移按照套路即可 cpp include incl 阅读全文
posted @ 2018-09-08 19:12 lokiii 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 枚举起点做spfa,然后一条边在最短路上的条件是dis[e[i].to]==dis[u]+e[i].va,所以每次spfa完之后,dfs出a[i]表示经过i点的最短路的起点数,b[i]表示经过i点的最短路的终点数,一条边(u,v)在当前起点下的答案就是a[u] b[v],最终答案是总和 因为最短路构 阅读全文
posted @ 2018-09-08 15:42 lokiii 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护 具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和 当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈里的子段的左端点不能小于当前左端点,需要一起右移 cpp include include using 阅读全文
posted @ 2018-09-08 11:28 lokiii 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 倍增数组的20和N写反了反复WAWAWA…… 注意到a和b在每个点上出发都会到一个指定的点,所以这样构成了两棵以n点为根的树 假设我们建出了这两棵树,对于第一问就可以枚举起点然后倍增的找出ab路径长度的比值,第二问同理,这里倍增的时候注意是先跳a再跳b,所以同一个点b的倍增数组要从a在这个点的的父亲 阅读全文
posted @ 2018-09-08 10:56 lokiii 阅读(130) 评论(0) 推荐(0) 编辑
摘要: kmp复健,答案是n next[n] cpp include include using namespace std; const int N=1000005; int n,ne[N]; char s[N]; int main() { scanf("%d%s",&n,s+1); int j=0; f 阅读全文
posted @ 2018-09-07 22:03 lokiii 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 有点神,按照1444的做法肯定会挂 注意到它的概率是相同的,所以可以简化状态 详见http://www.cnblogs.com/candy99/p/6701221.html https://www.cnblogs.com/liu runda/p/6919077.html 总之就是靠在kmp中的ne数 阅读全文
posted @ 2018-09-07 20:25 lokiii 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 本来打算把每个颜色剩下的压起来存map来记忆化,写一半发现自己zz了 考虑当前都能涂x次的油漆本质是一样的。 直接存五个变量分别是剩下12345个格子的油漆数,然后直接开数组把这个和步数存起来,记忆化dfs即可 cpp include include using namespace std; con 阅读全文
posted @ 2018-09-07 17:43 lokiii 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 二维哈希+二分 说是二维,其实就是先把列hash了,然后再用列的hash值hash行,这样可以O(n)的计算一个正方形的hash值,然后二分边长,枚举左上角点的坐标然后hash判断即可 只要base选的妙(闭眼随便敲一个数),单模数unsigned long long自然溢出也能过 阅读全文
posted @ 2018-09-07 17:14 lokiii 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 矩阵乘法一般不满足交换律!!所以快速幂里需要注意乘的顺序!! 其实不难,设f[i]为i的答案,那么f[i]=(f[i 1] w[i]+i)%mod,w[i]是1e(i的位数),这个很容易写成矩阵的形式,然后按每一位分别矩阵快速幂即可 矩阵: f[i 1] w[i] 1 1 f[i] i 1 0 1 阅读全文
posted @ 2018-09-07 16:51 lokiii 阅读(104) 评论(0) 推荐(0) 编辑
摘要: bzoj上是一个森林啊……? dp还是太弱了 设f[i][j][k]为到点i,合成j个i并且花费k金币能获得的最大力量值,a[i]为数量上限,b[i]为价格,p[i]为装备力量值 其实这个状态设计出来就好做了,树上背包随便转移一下就行了 因为是森林,所以最后统计答案的时候也要再做一遍背包 cpp i 阅读全文
posted @ 2018-09-07 10:50 lokiii 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 离线,按照l排序 注意到在区间里出现两次的颜色才有贡献,所以记录一个ne[i]表示i后第一个和i同色的花,维护一个l,每次处理询问的时候l单调右移,树状数组维护,在ne[ne[i]]位置++,在ne[i]位置 (因为这里已经++过了),这样区间查询的时候如果右端点超过ne[ne[i]]就能对答案有贡 阅读全文
posted @ 2018-09-07 09:21 lokiii 阅读(82) 评论(0) 推荐(0) 编辑
上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 29 下一页