摘要:
题意:1~n 的全排列中,有多少个排列满足任意从中间切成两段后,左边段的最大值大于右边段的最小值? 例如:n为3时有3种 2 3 1 3 1 2 3 2 1 解释:比如 2 3 1 (2) (3 1) 1比2小 (2 3) (1) 1比2小 都满足上面的条件。 3 2 1 (3)(2 1) 1比3小 阅读全文
摘要:
先简短几句话说说FFT.... 多项式可用系数和点值表示,n个点可确定一个次数小于n的多项式。 多项式乘积为 f(x)*g(x),显然若已知f(x), g(x)的点值,O(n)可求得多项式乘积的点值。 我们所需要的就是O(nlogn)快速地将两个系数多项式表示成点值多项式,O(n)求得乘积的点值表示 阅读全文
摘要:
用manacher算法O(n)求出所有的回文半径。有了回文半径后,就可以求出L[i]表示以i结尾的回文串的起始位置的和R[i]表示以i起始的回文串的结尾位置的和,然后就可以求出答案了,这里要注意奇偶长度回文串的不同处理。复杂度O(n) 1 #include<bits/stdc++.h> 2 usin 阅读全文
摘要:
取出纵向边按x坐标排序,在y方向上建立线段树。 每次查询当前有效长度len,ans += len*(x[i]-x[i-1]); 其中len为T[rt].len; 查询完毕后更新y方向上线段树,入边+1, 出边-1。 1 #include<bits/stdc++.h> 2 using namespac 阅读全文
摘要:
比赛的时候知道用树状数组,但有点乱不知道怎么处理。 统计不同的gcd的个数其实就是用树状数组统计区间内不同的数的模板题啊... 复杂度O(nlogn) 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5+10; 阅读全文
摘要:
递归写法,好久不写很容易就gg了... dp[i]=max(dp[j])+1,并且s[i]XORs[j]<=x 01字典树优化一下转移。 1 #include <bits/stdc++.h> 2 3 #define ll long long 4 #define ull unsigned long l 阅读全文
摘要:
整体二分可以算作是普通二分的进化版。普通二分可以解决多个操作,单个询问。时间复杂度为O(所有操作的复杂度f(n)*logC), C为需要二分的答案范围。 那么Q个询问呢?显然所有操作的复杂度是 > O(n)的,每个询问所有操作来一遍,那么就变成O(Q*所有操作的复杂度f(n)*logC), 复杂度就 阅读全文
摘要:
课件链接 CDQ分治 [BOI2007]MOKIA 题意:一个2000000*2000000的棋盘,每个格子有一个数,维护两种操作: ADD x, y: a A[x, y] += a; QUERY x0, y0, x1, y1: 询问矩阵内的和。 CDQ分治时按x维排序使用扫描线,y维使用树状数组。 阅读全文
摘要:
关于CDQ分治,首先需要明白分治的复杂度。 T(n) = 2T(n/2)+O(kn), T(n) = O(knlogn) T(n) = 2T(n/2)+O(knlogn), T(n) = O(knlog^2n) T(n) = 2T(n/2)+O(k), T(n) = O(kn) 那么我们要处理[l, 阅读全文
摘要:
题意:共n张无中生有,m张攻击牌。每张攻击牌攻击力已知,敌方有p点血。随机洗牌。游戏开始,己方抽取一张手牌,若是无中生有则可再抽两张牌。求能在第一回合内将敌方杀死的概率。 n+m <= 20, p <= 1000; 很明显,与卡特兰数有关,原先栈内数量为1,抽到无中生有即入栈,否则出栈。 枚举攻击牌 阅读全文