摘要:
显然每次都取排序后包含最大值的连续的一段数。 f[i]表示对于剩下的最小的i个数,先手最多比后手多多少分。 f[i]=min{a[j+1]-f[j]}...j<i,a升序排序。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 阅读全文
摘要:
哈希或者manacher·改。。我写manacher manacher在拓展的时候改一下判断条件就好了。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define ll lo 阅读全文
摘要:
枚举一个点rt作为三个房间的中点。 那三个房间肯定在rt的不同子树内,且深度相同。 f1[i],f2[i],f3[i]分别表示深度为i,取1,2,3个点的方案数。 时间复杂度O(n^2) 1 #include<cstdio> 2 #include<iostream> 3 #include<cstri 阅读全文
摘要:
题面无法直视系列。 中规中矩的线段树题。 涉及的操作有:区间赋值为0,计算区间内1的个数,区间赋值为1,求区间内最大的连续的1的个数。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 阅读全文
摘要:
这题面D人D得好狠啊 求组合数。。模数10007所以lucas一发。。 求一波逆元算较小的组合数。或者暴力跑也可以 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define 阅读全文
摘要:
显然每次走过的最小路程,就是按照dfs序走的总路程。 如果没修改的话其实是虚树。。 既然带了修改。。。其实就是维护关键点的dfs序。 用棵平衡树维护一下就好了,涉及到插入、删除、查找前驱后继、查找最大最小值。 算两点间路程还得求lca (所以这题就变成treap全套板子了。。。 1 #include 阅读全文
摘要:
一开始一脸懵逼。。 后来才想到维护一左一右俩指针l和r..表示[l,r]这段内不同种类的数字<=k+1种。 显然最左的、合法的l随着r的增加而不减。 顺便离散化,记一下各个种类数字出现的次数就可以算出答案了。 时间复杂度O(n) 1 #include<cstdio> 2 #include<iostr 阅读全文
摘要:
一个多月没更博客了。。(期间明白了自己有多傻逼。 这种问题大概就倒着做... f[i][j]:表示考虑剩下的硬币i..n,且之前的人取了j个时,先手最多拿到的钱数。aft[i]:表示硬币i..n的总钱数。 f[i][j]=aft[i]-min{ f[k][k-i] },(i<k<=min(n,i+2 阅读全文