摘要: 由于保证有解,所以1%gcd(x,y)=0,所以gcd(x,y)=1,直接做就行了 阅读全文
posted @ 2018-10-01 20:53 Ressed 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 设f[i][j]为把i拆成j个不重复的、大于0小于等于N的数的方案数 我们考虑一个方案是怎么来的:(初始状态是f[0][0]=1) 如果这个方案里有1,那它是先把原来的状态的每个数加1、然后再增加一个1 如果这个方案没有1,那它是把原来的状态直接每个数加1得来的 就对应了方程$f[i][j]=f[i 阅读全文
posted @ 2018-10-01 20:51 Ressed 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 考虑某个点产生的贡献: 如果i左边是一个比它小的数x,那有两种情况: 1.x的左边的数y大于i,肯定要把x合并到i,i的贡献++ 2.x的左边的数y小于i,那肯定要把x合并到y,而这时候递归地来考虑,总有一天y或更左边的一个数是要合并到i上的,i的贡献++ 如果i左边的数x比它大,那就把i合并到x, 阅读全文
posted @ 2018-10-01 20:44 Ressed 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 1 #include 2 #define pa pair 3 #define CLR(a,x) memset(a,x,sizeof(a)) 4 using namespace std; 5 typedef long long ll; 6 const int maxn=1010,maxm=110; 7 8 inline ll rd(){ 9 ll x=0;char c=... 阅读全文
posted @ 2018-10-01 20:38 Ressed 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 先从大到小排序,看到哪个的时候安排不开了 给每个人拆成两个,如果x和y有矛盾,就给x和y‘、y和x’连边;如果a和b(或a'和b')在同一个集合里,说明他们一定要在同一个监狱里。 阅读全文
posted @ 2018-10-01 20:37 Ressed 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 先二分出一个时间,把每个军队倍增往上跳到不能再跳 然后如果它能到1号点,就记下来它跳到1号点后剩余的时间;如果不能,就让它就地扎根,记一记它覆盖了哪些叶节点(我在这里用了dfs序+差分,其实直接dfs就行..) 然后对于那些叶节点没有被覆盖完全的(父亲为1号点的)子树,肯定需要一些已经到1号点的军队 阅读全文
posted @ 2018-10-01 20:09 Ressed 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 先二分一个答案x,然后通过差分来看有没有不满足的 阅读全文
posted @ 2018-10-01 19:58 Ressed 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 做dijkstra,但只需要贪心地把每个点连到它左边、右边、上边、下面的第一个点就可以了 阅读全文
posted @ 2018-10-01 19:56 Ressed 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 先用不管什么方法求出来从每个点出发,A走到哪、B走到哪(我写了一个很沙雕的STL) 然后把每个点拆成两个点,分别表示A从这里出发和B从这里出发,然后连边是要A连到B、B连到A、边长就是这次走的路径长度 为了方便,把不能继续走的点连到一个假节点1上(不连应该也无所谓) 然后我们预处理倍增,但要把A走的 阅读全文
posted @ 2018-10-01 19:53 Ressed 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 把一条路径拆成到根的四个链(两端点、lca和fa[lca]),然后给dfs序中链的端点做单点修改、区间查询它的子树和再加上它原来的权值就可以了 阅读全文
posted @ 2018-10-01 19:47 Ressed 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 算出来每个数被计算答案的期望次数就可以 考虑这个次数,我们可以把一次合并反过来看,变成把一个数+1然后再复制一个 记f[i][j]为一共n个数时第j个数的期望次数,就可以得到期望的递推公式,最后拿f[N]乘一乘就行了 要注意每一位的期望次数是不一样的..不存在什么中间的次数一样之类的... 阅读全文
posted @ 2018-10-01 19:42 Ressed 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 把询问记下来,然后开个桶差分 阅读全文
posted @ 2018-10-01 19:23 Ressed 阅读(275) 评论(0) 推荐(0) 编辑