摘要: 设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 阅读(221) 评论(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 阅读(332) 评论(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 阅读(403) 评论(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 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 对于任意两个建筑物,以它们之间的最短路为边权求出最小生成树。则询问(x,y)的答案为最小生成树上x到y路径上边权的最大值。BFS求出离每个点最近的建筑物以及到它的距离,可以发现只有交界处的边才有用,用这些边求MST即可。#include#includeusing namespace std;cons... 阅读全文
posted @ 2015-08-19 02:12 Claris 阅读(521) 评论(0) 推荐(0) 编辑