09 2015 档案
摘要:不管怎么修改,所有数字的排名都不会发生变化。将a[]从小到大排序之后,维护一棵线段树,在上面修改。对于收割操作,在线段树上二分,找到需要修改的后缀进行区间赋值即可。时间复杂度O(mlogn)。#include#include#define N 1050000typedef long long...
阅读全文
摘要:注意到f(n)不会超过1459,于是暴力枚举f(n),检验n=k*f(n)是否合法即可。#includelong long k,a,b,t;int i,j,ans;int main(){ scanf("%lld%lld%lld",&k,&a,&b); for(i=1;i<=1459&&k<=b/...
阅读全文
摘要:线段树每个区间维护上下界以及要整体增加的标记即可,时间复杂度O(mlogn)。#include#define inf 1500000000int n,m,op,c,d,p;struct Node{int l,r,t;}T[1050000];inline void read(int&a){ ...
阅读全文
摘要:首先在串的末尾加上1000,然后进行归并,每次取字典序较小的那个后缀即可。用hash+二分支持查询lcp,时间复杂度O(nlogn)。#includetypedef long long ll;const int N=200010,P=31,D=1000173169;int n,m,i,j,k...
阅读全文
摘要:假设分成如下三段:[1..i][i+1..j][j+1..n]考虑中间那一段,设f[i]为前i位组成的数模q的值,pow[i]为10i模q的值,那么有:f[j]-f[i]*pow[j-i]=0f[j]*pow[i]=f[i]*pow[j]f[j]*inv(pow[j])=f[i]*inv(po...
阅读全文
摘要:建立线段树,S向每个叶子连边,容量1,费用0。孩子向父亲连边,容量inf,费用0。每个强盗向T连边,容量1,费用为c[i]。对应区间内的点向每个强盗,容量1,费用0。求最大费用流即可。#includeconst int inf=~0U>>2,N=15010,M=1000000;int n,i,A,B...
阅读全文
摘要:设f[i][j]为a[1..i]与b[1..j]的LCS,g[i][j]为a[i..n]与b[j..m]的LCS。若C为0,则ans=f[n][m]。否则求出d[i]=a中从i开始往右匹配上c串的位置以及e[i]=b中从i开始往右匹配上c串的位置。则ans=max(f[i-1][j-1]+g[d[i...
阅读全文
摘要:把时间看成第一维,编号看成第二维,则每个询问等价于询问某个矩形范围内与某个数异或的最大值。从高位到低位贪心,考虑离线分治,假设当前处理第k位,那么把所有点以及按这一位分成两类,分别扫描线+树状数组维护即可。时间复杂度O(nlog2n)。#include#include#define N 20...
阅读全文
摘要:首先将所有显然不在最优解中的外卖都删去,那么剩下的外卖价格越低,保质期也最短。考虑三分订外卖的次数,然后贪心求解,每次尽量平均的时候可以做到最优化。三分的时候,以存活天数为第一关键字,剩余钱数为第二关键字,就能使函数严格上凸,这样才可以保证三分的正确性。时间复杂度O(nlogm)。#incl...
阅读全文
摘要:首先将所有高度乘上10,设f[i]为将前i本书放入书架的最小高度,则\[\begin{eqnarray*}f[i]&=&\min(f[j-1]+first(j,i)+second(j,i)+W-(s[i]-s[j-1]))\\ &=&\min(f[j-1]+first(j,i)+second(...
阅读全文
摘要:对每个点维护一个bitset,记录哪些点可以攻击它。可以通过kd-tree+标记永久化实现。对于一个阵营,它在m轮之后防御系统全部完好的概率为(1−攻击它的点数n)m。时间复杂度O(n√n+nk32)。#include#include#inc...
阅读全文
摘要:最大值和最小值的问题是独立且相似的,考虑最大值:考虑离线,设ask(i,l,r)为以1到i为右端点时左端点在区间[l,r]内的区间最大值的和。从1到n枚举右端点,假设现在是i,那么可以通过单调栈求出最小的j使得[j,i]内a[i]是最大值。然后左端点在[j,i]区间内的所有区间最大值都应当变为a[i...
阅读全文
摘要:若x与y可能成为好*友,那么它们连出去的点除了x和y之外都相同。于是给每个点一个long long的随机权值,然后每个点的hash值为与其相连的点的权值的异或和,若两个点hash值相等,则可行。给每个点的hash值异或上自己本身的权值再求一次即可得到正确答案。时间复杂度O(nlogn)。#i...
阅读全文
摘要:令d[i]为第i个样本数据,cnt为样本个数,经过化简可得ans=∑(d[i]2)cnt−(∑d[i]cnt)2枚举每一种可能的三核苷酸,得到它出现的各个位置,假设当前出现了tot个,第i个的编号为a[i],经过化简可得\[cnt+=C_...
阅读全文
摘要:取一棵生成森林,根据题目限制可得,与一个点相连的多余的边数是O(√m)级别的。对于树边,每个点维护3棵权值线段树,依次保存它的儿子里各个集合的边。再开3*3个分块数组,记录多余边以及树边每种权值的出现次数,修改时暴力修改多余边,时间复杂度O(q√m)。#include...
阅读全文
摘要:假设字符串是从第0位开始的,那么对于两个长度都为n的字符串A,B,定义距离函数dis(A,B)=n−1∑i=0(A[i]−B[i])2[A[i]!=′∗′][B[i]!=′∗′]若把*号都设置为0,那么有\[dis(A,B)=\sum_{i=0}^{n-1}(A[i]-B...
阅读全文
摘要:首先对于每个位置,求出它开始长度为y的横行的hash值,然后对于hash值再求一次竖列的hash值,排序后求出众数即可。时间复杂度O(n2logn)。#include#include#define N 1010typedef unsigned long long ll;const ll D...
阅读全文
摘要:设s[i]为进行i次加密后所有奶牛数字的和,有s[i]=(n−1)s[i−1]。设c[i]为某头固定的奶牛进行i次加密后的数字,若i为奇数,有:\[c[i]=((1-n)^0+(1-n)^1+...+(1-n)^{T-1})s-c[0]=\frac{(1-(1-n)^T)s}...
阅读全文
摘要:因为两棵树中间只有k条边,所以这些边一定要用到。对于每棵树分别考虑:如果一个点往下连着两个点,那么这个点往上的那条边一定不能用到。如果一个点往下连着一个点,那么这个点往上的那条边一定不能用到。否则一定无解。这样求出所有一定要用到的边后,如果不存在奇点且这个图是个连通图的话,那么就有解。时间复杂度$O...
阅读全文
摘要:考虑计算LCS的DP过程,设f[i][j]表示T串的前i项与S串的前j项的LCS,则若T[i]==S[j],则f[i][j]=f[i-1][j-1]+1否则f[i][j]=max(f[i-1][j],f[i][j-1])对于固定的i,f[i][j]只可能为f[i][j-1]或f[i][j-1]+1,...
阅读全文
摘要:对于一条路径x-y:·若x与y成祖先-孩子关系,假设y是x的祖先,z是y到x方向的第一个节点,则包含它的路径满足:起点在x的子树里,且终点不在z的子树里。·若x与y不成祖先-孩子关系,则包含它的路径满足:起点在x的子树里,且终点在y的子树里。于是每个盘子可以拆成一个或两个矩形,每个水果可以当成两个点...
阅读全文
摘要:一个点的感染时间为它到根路径上虚边数+1。用Link-Cut Tree模拟虚实边切换,每次切换时等价于在一段或两段DFS序区间更新,线段树维护即可。时间复杂度O(nlog2n)。#includetypedef long long ll;const int N=100010,M=262145;...
阅读全文
摘要:用后缀树统计出出现了x次的本质不同的子串的个数,最后再乘以x,得到一个多项式。这个多项式常数项为0,但是一次项不为0。于是把整个多项式除以一次项,通过多项式求ln和多项式求exp求出它的幂。最后再把除掉的项乘回来即可,时间复杂度O(nlogn)。#include#includetypedef...
阅读全文
摘要:对于一条边x->y,若去掉之后x不能到达y,那么它是必需的。首先拓扑排序求出拓扑序,然后按照终点拓扑序为第一关键字,起点拓扑序为第二关键字从小到大加边。对于每个点,维护一个bitset,表示当前从哪些点可以到达自己。时间复杂度O(nm32)。#include#include#i...
阅读全文
摘要:树链剖分+线段树。线段树每个区间[l,r]维护:m:最大的负数s:所有数字绝对值的和d:正数的个数-负数的个数t:懒惰标记区间修改时,若最大的负数=0,则暴力递归,否则打标记。因为每个负数只会被暴力修改一次,所以时间复杂度为O(nlog2n)。#include#define N 100010...
阅读全文
摘要:树上带修改莫队算法,对于维护mex值,可以使用修改O(1),查询O(√n)的权值分块,总时间复杂度为O(n53)。#include#include#define N 50010#define K 15using namespace std;inline v...
阅读全文
摘要:可以修建的缆车总数不超过n,于是可以先通过O(n2)的枚举求出所有可以修建的缆车。对于一个缆车,若它仅连接i和i+1,那么它不受k的限制,把这种缆车额外取出,从大到小排序。剩下的缆车两两之间要么是包含关系,要么没有任何交集,按照包含关系可以建出一棵树。设f[i][j][k]表示以i为根的子树中...
阅读全文
摘要:答案=回文子序列数目-回文子串数目。回文子串数目可以通过Manacher在O(n)时间内求出。对于求回文子序列的数目,设f[i]为以i为对称中心的字符对数,则它对答案的贡献为2f[i]−1。对于两个数1≤i≤j≤n,若a[i]==a[j],那么它们对f[i+...
阅读全文
摘要:首先旋转坐标系,把每个点可以接收的范围转化成一个正方形。然后建立k-d tree,并记录下每个点在k-d tree上的位置。对询问使用莫队算法,修改O(logn),查询期望O(logn)。总复杂度O(n√nlogn)。#include#include#includ...
阅读全文
摘要:设一种方案里三角形上三个点的坐标分别为(0,0),(−a,b),(c,d),则得到的平行四边形的面积为ac+bd。设d(n)为n的约数个数,D为d的生成函数,则答案的生成函数=D2。先用线性筛O(n)求出d,再用FFT在O(nlogn)的时间内预处理出所...
阅读全文
摘要:对于一个点,要求出它到所有点的带权距离和,只需记录下树分治的结构然后查询即可。修改O(logn),查询O(logn)。到所有点带权距离和最小的点显然是这棵树的带权重心。以1号点为根,考虑一条从父亲x到孩子y的边:若y子树内权值和>=总权值和-y子树内权值和,即2*y子树内权值和>=总...
阅读全文
摘要:显然资源集合处就是树的重心,这题需要动态维护树的重心。每个连通块以重心为根,用link-cut tree维护每个点的子树大小以及子树内所有点到它的距离和。合并两个连通块时,考虑启发式合并,暴力往大的树中添加叶子。添加叶子时,需要将叶子到重心路径上所有点的子树大小+1,距离和则加上一个等差数列。并且新...
阅读全文