摘要:
AC自动机+树状数组 先建出fail树,对于查询x在y中出现几次,就等于在x为根的子树下有多少个节点为单词y在tire树路径上所在的节点,可用dfs+树状数组离线求出答案。 阅读全文
摘要:
以一个数字开头的子序列的gcd种类不会超过logn种,因此去找相同gcd最长的位置,更新一下答案,复杂度O(nlogn^2) 1 #include 2 #include 3 #include 4 #define N 300010 5 using namespace std; 6 int n,i,Lo... 阅读全文
摘要:
折半搜索,先搜索一半的数字,记录第一个人的值,第二个人、第三个人和第一个人的差值,开个map哈希存一下,然后另一半搜完直接根据差值查找前一半的答案。 代码 1 #include 2 #include 3 #define ll long long 4 #define N 100 5 using ... 阅读全文
摘要:
比较容易想到的做法是线段树套字典树,修改操作时在字典树上经过的节点维护一个最近被访问过的时间,这样询问操作只经过满足时间条件的节点,时间复杂度O(NlogN^2)但是因为线段树每个节点都要套个字典树,这样的话空间是不够的,不过由于可以离线处理,我们可以先把每个修改和询问操作所访问的线段树节点保存... 阅读全文
摘要:
dp,首先建出图,f[i][j]表示a吃到了i点,b吃到了j点的最大值,转移的时候转移拓扑序小的那一维,如果i拓扑序小于j,那么转移到f[k][j],否则转移到f[i][k],建出的图边数也要优化,不然会超时。优化的方法是假如i,j连边,那么如果有一条边(i,k),x[k]>x[j]并且y[k]... 阅读全文
摘要:
设dp[n]为n个数字排列时候的答案,那么可以得到dp方程 dp[n]=Σdp[n-i]*c(n-1,i-1)*(i-1)!*i^2(1 #include #include using namespace std; typedef long long LL; ... 阅读全文
摘要:
先求出dfs序,然后建立线段树,线段树每个节点套一个set。 修改操作只需要改被子树区间完全覆盖的线段树节点,将其节点中set的原来的值删除,加入新值。 询问操作查询单点到根的所有节点上的set中与查询值异或起来最大的那个。 查询set中的数与x异或的最大值,可以从高位到低位枚举二进制位,... 阅读全文
摘要:
莫队算法,预处理出每个数字往后的gcd情况,每个数字的gcd只可能是他的因子,因此后面最多只可能有logn种,可以先预处理出,然后套莫队算法,复杂度O(n*sqrt(n)*log(n))。 代码 1 #include 2 #include 3 #include 4 #include... 阅读全文
摘要:
FFT代码 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 const int N = 400005; 9 const double PI = acos(-1.0);... 阅读全文
摘要:
分治+并查集。假设要求[L,mid]的答案,那么很明显,如果一条边的两个端点都>mid的话或者一个端点>mid一个端点 2 #include 3 #define N 300010 4 using namespace std; 5 int f[N],d[N]; 6 int n,m,i,d... 阅读全文