Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

08 2015 档案

摘要:设d=gcd,则a+b|ab等价于x+y|xyd。因为x,y互质,所以x+y|d。假设$xtypedef long long ll;const int N=46500,M=505030;int n,m,lim,i,j,d,l,r,vis[N],to... 阅读全文
posted @ 2015-08-31 12:07 Claris 阅读(353) 评论(0) 推荐(0) 编辑
摘要:对于每条对角线,若需要改变方向,则连边权为1的边,否则连边权为0的边,然后求从左上角到右下角的最短路即可。对于本题,可以用BFS来求最短路,每次扩展时把连通块内所有可以通过0边权的边走到的点加入队尾。时间复杂度O(n^2)。#includeconst int N=510,M=251010,T=M... 阅读全文
posted @ 2015-08-23 22:56 Claris 阅读(399) 评论(0) 推荐(0) 编辑
摘要:以深度建立线段树,线段树父亲节点向儿子节点连边,然后用线段树合并可以得到任何一个点子树的线段树,只需向对应节点的线段树中的O(\log n)个点连边即可。为了保证连边关系不发生混乱,线段树需要进行可持久化。这样建图,点数和边数都是O(n\log n)级别的,再求出强连通分量,用排列组合求出答... 阅读全文
posted @ 2015-08-23 19:10 Claris 阅读(379) 评论(0) 推荐(0) 编辑
摘要:设f[i]表示以i为结尾的最长的合法序列的长度,=号直接维护,号用两棵树状数组维护即可,时间复杂度O(n\log n)。#include#define N 1000000int n,k,i,j,a[N],e[N+1],bl[N+1],bg[N+1],f[N],ans;char s[N];inli... 阅读全文
posted @ 2015-08-19 23:33 Claris 阅读(227) 评论(0) 推荐(0) 编辑
摘要:首先将挂饰按照挂钩个数从大到小排序,然后DP设f[i][j]处理完前i个挂饰,还有j个多余挂钩的最大喜悦值,则f[0][1]=0f[i][j]=max(f[i-1][max(j-a[i],0)+1]+b[i],f[i-1][j])时间复杂度O(n^2)。#include#include#defi... 阅读全文
posted @ 2015-08-19 19:28 Claris 阅读(334) 评论(0) 推荐(0) 编辑
摘要:按位考虑,逐步确定答案。设当前是第i位,求出第i位的前缀异或和。若存在m个0且所有数字异或和为0,那么答案的这一位可以为0,并把所有1的位置给标记为不可选。否则答案的这一位只能是1。时间复杂度O(n\log n)。#include#define N 500010int n,m,i,j,t,b[N... 阅读全文
posted @ 2015-08-19 17:35 Claris 阅读(407) 评论(0) 推荐(1) 编辑
摘要:设g[i][j]为i串至少加上几个字符后才能包含j,可以通过Hash求出。然后就是求经过m-1条边的最短路,用倍增加速Floyed即可,时间复杂度O(n^3\log m)。#include#include#define rep(i,n) for(int i=0;ib)a=b;}struct ma... 阅读全文
posted @ 2015-08-19 17:31 Claris 阅读(261) 评论(0) 推荐(0) 编辑
摘要:对于任意两个建筑物,以它们之间的最短路为边权求出最小生成树。则询问(x,y)的答案为最小生成树上x到y路径上边权的最大值。BFS求出离每个点最近的建筑物以及到它的距离,可以发现只有交界处的边才有用,用这些边求MST即可。#include#includeusing namespace std;cons... 阅读全文
posted @ 2015-08-19 02:12 Claris 阅读(525) 评论(0) 推荐(0) 编辑
摘要:考虑按时刻从早到晚模拟,计算出f[i]:到达i点的最晚出发时间g[i]:为了赶上第i辆车的最晚出发时间然后将所有到达n号点的巴士按到达时间排序,查询的时候二分查找即可。时间复杂度O(n\log n)。#include#include#include#include#define N 300010... 阅读全文
posted @ 2015-08-18 21:13 Claris 阅读(565) 评论(0) 推荐(0) 编辑
摘要:考虑按x坐标排序后分治,只需考虑计算左下角在[l,mid],右上角在[mid+1,r]的矩形数。对于[l,mid]的点,从右往左考虑,求出它可以贡献到的纵坐标区间。对于[mid+1,r]的点,从左往右考虑,求出它可以接受的纵坐标区间。然后扫描线+Treap维护即可,时间复杂度$O(n\log^2n)... 阅读全文
posted @ 2015-08-18 03:10 Claris 阅读(785) 评论(0) 推荐(0) 编辑
摘要:莫队算法,考虑如何快速维护最大的重要度。考虑到答案一共只有O(n)种本质不同的取值,于是可以先通过O(n\log n)的排序处理出这些值的大小关系,并将这些值离散化,同时对每种事件的每个出现次数维护两个指针pre和nxt,分别表示出现次数减少或增加一后是第几小。然后对这些取值进行分块,每块维... 阅读全文
posted @ 2015-08-18 00:31 Claris 阅读(952) 评论(0) 推荐(1) 编辑
摘要:如果一条边可行,那么删掉这条边后,剩下的图是二分图且该边的两端点颜色相同。那么可行的边必然属于所有奇环的交集,且不属于任何偶环。随便取一棵生成树,对于一条非树边,它形成了环:若是偶环,则将环上的边都标记为不能选。若是奇环,则将环上的边经过的奇环数都加一。可以用树链剖分维护前缀和做到$O(m\log ... 阅读全文
posted @ 2015-08-17 21:41 Claris 阅读(945) 评论(0) 推荐(2) 编辑
摘要:若直线的斜率为0或者不存在斜率,则有nC(m,3)+mC(n,3)种方案。若直线的斜率不为0,只需考虑斜率为正的情况,最后答案再乘以2即可。枚举两个点的坐标差,设t=\min(n,m),则有:\[\begin{eqnarray*}ans&=&\sum_{i=1}^n\sum_{j=1}^... 阅读全文
posted @ 2015-08-17 17:28 Claris 阅读(509) 评论(0) 推荐(0) 编辑
摘要:若能得到一个和为t的区间,那么至少去掉两端点中任意一个后必定能得到和为t-2的区间。所以只需要分别找到和最大的和为奇数和偶数的区间,然后O(n)完成构造即可。#include#define N 1000010int n,m,i,s[N],b,c,d,t,l,r,f[N='0')&&(c='0')... 阅读全文
posted @ 2015-08-17 01:53 Claris 阅读(262) 评论(0) 推荐(0) 编辑
摘要:将a从小到大排序可以得到最优解,设f[i][j]表示前i个用了j种颜色的最小累计误差,则f[i][j]=min(f[k-1][j-1]+w(k,i))。其中w(k,i)为[k,i]区间里所有数与中位数的差值的绝对值之和,有w(k,i)=w(k+1,i)+a[(k+i+1)>>1]-a[k]。时间复杂... 阅读全文
posted @ 2015-08-16 01:01 Claris 阅读(267) 评论(0) 推荐(0) 编辑
摘要:首先模拟一遍得到n个同余方程,然后用扩展欧几里得求出最小的可行解即可,时间复杂度O(n^2)。#include#define N 30int n,i,j,k,x,y,a[N],b[N],d[N],ans;namespace Solve{int flag=1,k=1,m=0,d,x,y;int e... 阅读全文
posted @ 2015-08-15 17:21 Claris 阅读(351) 评论(0) 推荐(0) 编辑
摘要:考虑到lcm(1,2,3,4,5,6)=60,所以操作序列每60秒一个循环。将操作表示成转移矩阵的形式,预处理出前60秒的转移矩阵以及它们的乘积B。那么t秒的转移矩阵为前t\bmod 60个转移矩阵的乘积乘以B^{\lfloor\frac{t}{60}\rfloor}。用矩阵快速幂加... 阅读全文
posted @ 2015-08-14 23:12 Claris 阅读(522) 评论(0) 推荐(0) 编辑
摘要:设f[i][j]表示串ij可以由哪些字母成长过来,用二进制压位表示。设g[i][j]表示给定串中[i,j]这个区间一开始可以由哪些字母成长多来,用二进制压位表示。设h[i]表示给定串前i位最少需要几个字母,h[i]=min(h[j]+1),j#include#define N 105int T,n,... 阅读全文
posted @ 2015-08-14 20:50 Claris 阅读(591) 评论(0) 推荐(0) 编辑
摘要:二分答案mid,将差距先都调到mid以内。首先从左往右扫,a[i]=min(a[i],a[i-1]+mid)。然后从右往左扫,a[i]=min(a[i],a[i+1]+mid)。枚举要变为0的位置,求出L,R使得:a[L]>(i-L)mida[R]>(R-i)mid此时只需要把[L,i]和[i,R]... 阅读全文
posted @ 2015-08-14 03:23 Claris 阅读(565) 评论(0) 推荐(0) 编辑
摘要:设b[i]为将i分解质因数后所有质数的指数和,则d(i,j)=b[i]+b[j]-2b[\gcd(i,j)]。设d[i]为i的倍数中的最优解和次优解。对于i,枚举它的约数k作为gcd,然后用d[k]去更新ans[i]即可。时间复杂度O(n\log n)。#include#define N 1... 阅读全文
posted @ 2015-08-13 22:54 Claris 阅读(384) 评论(0) 推荐(0) 编辑
摘要:对于根,要让它的排名尽量小,也就是要让右子树的点数尽量多。于是从大到小枚举右子树的点数,用Catalan数计算方案数,直到找到相应的右子树的点数为止。此时根的排名已经确定,接下来要让左子树的代码的字典序尽量小,递归解决即可。#includeint n,k,i,j,f[20];void solve(i... 阅读全文
posted @ 2015-08-12 14:56 Claris 阅读(329) 评论(0) 推荐(0) 编辑
摘要:从上到下枚举行,可以O(m)更新现在每一列往上连续的1的个数,也可以在O(m)的时间内完成排序。总复杂度O(nm)。#include#define M 1510int n,m,x,i,j,b[M],ans,q[2][M],t;char a[M];int main(){ for(scan... 阅读全文
posted @ 2015-08-10 23:31 Claris 阅读(381) 评论(0) 推荐(0) 编辑
摘要:求出M的原根g以及每个数i的指标ind[i]。则(a\times b)\bmod M = x等价于(ind[a]+ind[b])\bmod \varphi(M) = ind[x]。这是个循环卷积,用快速幂+NTT加速运算即可,时间复杂度O(m\log m\log n)。#... 阅读全文
posted @ 2015-08-10 19:38 Claris 阅读(1001) 评论(2) 推荐(1) 编辑
摘要:二分答案,转化成判定所有科学家能否在lim时间内走到安全的地方考虑网络流,对于每个非叶子节点,S向它连边,容量为该点科学家的人数对于每个叶子节点,向T连边,容量为该点的容量对于每个非叶子节点x,枚举它的所有祖先,对于一个祖先y,向y子树中所有与x距离不超过lim的点连边,容量为inf由于数据随机,所... 阅读全文
posted @ 2015-08-09 16:44 Claris 阅读(241) 评论(0) 推荐(0) 编辑
摘要:\begin{eqnarray*}ans&=&m^{\sum_{i=1}^n Stirling2(n,i)\bmod 999999598}\bmod 999999599\\&=&m^{B_n\bmod 999999598}\bmod 999999599\end{eqnarray*}99999... 阅读全文
posted @ 2015-08-09 02:38 Claris 阅读(594) 评论(0) 推荐(0) 编辑
摘要:设g[i]表示n=i时的答案,则OEIS上可以找到如下递推式:g[i]=g[i-1]+g[i-2]-g[i-5]-g[i-7]+...其中符号为++--交替,第i项为f[i],f[1]=1,f[2]=2,f[3]=5,f[4]=7f[i]=3+2*f[i-2]-f[i-4]注意到f[731]>200... 阅读全文
posted @ 2015-08-09 00:28 Claris 阅读(547) 评论(0) 推荐(0) 编辑
摘要:二分答案,转化为判定能否划分成不超过m段,且对每段求最小圆覆盖得到的圆半径不超过mid。对于当前的i,倍增出一个j,使得[i,i+(1#include#include#include#define N 100010using namespace std;int n,m,i,T=50,cnt,ans[... 阅读全文
posted @ 2015-08-08 17:58 Claris 阅读(474) 评论(0) 推荐(0) 编辑
摘要:首先旋转坐标系x'=x-yy'=-x-y则对于一个点,它下一步可以往它左上角任意一个点连线。根据Dilworth定理,答案=这个偏序集最长反链的长度。设f[i]为到i点为止的最长反链长度,则f[i]=max(f[j])+1,j在i的左下角按x坐标排序后用树状数组优化DP即可,时间复杂度$O(... 阅读全文
posted @ 2015-08-07 23:06 Claris 阅读(326) 评论(0) 推荐(0) 编辑
摘要:新建源汇S,T,根据题意可以建出一个DAG设f[x][y]为从x走到y的回文路径的方案数,则边界条件:f[x][x]=1对于一条边x->y,若a[x]==a[y],则f[x][y]=1转移方程为:若a[x]==a[y],则f[x][y]=sum(f[i][j])(x->i有边,j->y有边)若a[x... 阅读全文
posted @ 2015-08-07 20:45 Claris 阅读(439) 评论(0) 推荐(0) 编辑
摘要:设d[i]表示能拼出的x中满足x%a[0]=i的最小的x,其中d[0]=0。若d[x%a[0]]#include#include#includeusing namespace std;typedef pairP;const int N=50010,inf=1000000010;int n,m,i,x... 阅读全文
posted @ 2015-08-07 15:13 Claris 阅读(661) 评论(0) 推荐(0) 编辑
摘要:考虑离线。用Link-Cut Tree维护删除时间的最大生成树。加入一条边时,如果两点不连通则直接link,否则肯定有一条边多余,若形成奇环则将多余的边加入集合。删除一条边时,若这条边是树边则直接删除,否则若在集合中,则从集合中删除。查询时,如果集合中没有边,则为二分图。#includeconst ... 阅读全文
posted @ 2015-08-06 20:45 Claris 阅读(760) 评论(0) 推荐(0) 编辑
摘要:设f[i][j]为前i个字符中j出现的次数,则ans=max((f[r][i]-f[l-1][i])-(f[r][j]-f[l-1][j]))=max((f[r][i]-f[r][j])-(f[l-1][i]-f[l-1][j])),其中f[r][j]!=f[l-1][j]。考虑枚举r,当r从r-1... 阅读全文
posted @ 2015-08-06 00:49 Claris 阅读(608) 评论(0) 推荐(0) 编辑
摘要:考虑构造一组可行解,把每个点拆成两个点x0,x1,x0表示后勤组织,x1表示同谋者。若x与y认识,则x1向y0连边。若x与y不认识,则x0向y1连边。如此求出一组2-SAT的可行解,如果无解则答案为0。若有解,那么最多只能把一个人从后勤组织改为同谋者,也最多只能把一个人从同谋者改为后勤组织。于是预处... 阅读全文
posted @ 2015-08-05 23:25 Claris 阅读(502) 评论(0) 推荐(0) 编辑
摘要:如果两个环相交,那么相交的部分相当于没走。因此一定存在一种方案,使得里面的环都不相交。把不需要改变状态的边都去掉,剩下的图若存在奇点则无解。否则,每找到一个环就将环上的边都删掉,时间复杂度O(n+m)。#includeconst int N=2000010,BUF=20000000;int n,... 阅读全文
posted @ 2015-08-05 17:22 Claris 阅读(590) 评论(0) 推荐(1) 编辑
摘要:暴力枚举k,对于一个子串,计算它正着的hash值以及反着的hash值,取最小值得到其最终hash值。对于k,一共有\lfloor\frac{n}{k}\rfloor个子串,计算出它们的最终hash值即可统计出不同子串的个数。时间复杂度O(n\log n)。#includetypede... 阅读全文
posted @ 2015-08-05 01:01 Claris 阅读(420) 评论(0) 推荐(0) 编辑
摘要:\[\begin{eqnarray*}&&\sum_{i=0}^{n-1}\left(ki+b-a_i\right)^2\\&=&\sum_{i=0}^{n-1}\left(k^2i^2+b^2+a_i^2+2kbi-2kia_i-2ba_i\right)\\&=&k^2\sum_{i=0}^{n-... 阅读全文
posted @ 2015-08-04 23:15 Claris 阅读(506) 评论(0) 推荐(0) 编辑
摘要:设f[x]为x子树里能选的最多的路径数,h[x]为x子树里往上走的点的集合,且不与x子树内的最优解冲突首先f[x]=sum(f[son])若h[son]与x可以直接匹配,则匹配上,f[x]++然后把剩下的未配对的son之间进行匹配,f[x]+=最大匹配数因为度数不超过10,所以设dp[S]表示二进制... 阅读全文
posted @ 2015-08-04 21:44 Claris 阅读(641) 评论(0) 推荐(0) 编辑
摘要:对于区间[l,r],若询问的直线与该区间的凸壳有交,则有解。在线段树每个区间上维护凸壳,然后查询时在相应凸壳上二分斜率即可,时间复杂度O(n\log^2n)。#include#define N 262145typedef long long ll;int T,n,i,c,l[N],r[N],t;... 阅读全文
posted @ 2015-08-04 01:22 Claris 阅读(498) 评论(0) 推荐(0) 编辑
摘要:设f[x]表示得到x这个回文串的最小步数,则ans=min(n-len[x]+f[x])边界条件f[长度为0的偶回文串]=1因为翻转只会得到偶回文串,所以f[奇回文串]=该串的长度对于一个偶回文串x,设y为x去掉首尾得到的串,有f[x]=f[y]+1设y为长度不超过x的一半的x的最长回文后缀,有f[... 阅读全文
posted @ 2015-08-03 22:38 Claris 阅读(969) 评论(0) 推荐(1) 编辑
摘要:首先求出B和W的个数,如果只出现了一种那么直接输出sum(k)。否则依次扫描,能割就割,时间复杂度O(n)。#include#define N 100010typedef long long ll;int T,n,i,a[N],b[N],c[2],d[2],ans;ll x;char s[2];... 阅读全文
posted @ 2015-08-03 01:23 Claris 阅读(502) 评论(0) 推荐(0) 编辑
摘要:考虑离线,将物品和询问都按a从小到大排序。然后对于当前处理的询问,将所有a不超过它的物品都加入背包中。设f[i]表示和为i时min(b)的最大值,若f[k]>m+s,则TAK。时间复杂度O(q\log q+nk)。#include#includeconst int N=1000010,M=100... 阅读全文
posted @ 2015-08-03 00:37 Claris 阅读(336) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示