数据结构
After0514
这个作者很懒,什么都没留下…
展开
-
Codeforces 283E
不合法的三元组情况一定是这样的, 存在一个项,比其他两个都大, 所以求出每个数比他小的有多少个num[i],总的不合法的就是 ∑ni=1C(num[i],2)\sum_{i=1}^n C(num[i],2) 总共 C(n,3)种情况,减一下就好了 假如要求num[i],把和i有关的区间修改,线段树操作一下, 然后统计 原本比它小的总共修改偶数次 原本比它大的总共修改奇数次, 就是n原创 2016-12-25 12:38:54 · 406 阅读 · 0 评论 -
CodeForces 75D
线段树维护为最长的连续为空的子段#include<cstdio>#include<iostream>#include<cstring>#include<map>#include<set>using namespace std;const int N=64e5+10;#define ll son[o][0]#define rr son[o][1]#define mid (l+r)/2原创 2016-12-02 10:05:46 · 284 阅读 · 0 评论 -
CodeForces 601E
[http://blog.csdn.net/lqybzx/article/details/52338272]cdq咯#include<cstdio>#include<iostream>#include<cstring>#include<queue>using namespace std;const int N=4e4+100;const int P=1e7+19;const int Q原创 2016-11-15 19:54:33 · 245 阅读 · 0 评论 -
CodeForces 524F
字典序最小可以用后缀数组 判断合法不合法可以用线段树维护前缀和最小值,//rk[0~n-1]:1~n sa[1~n]=0~n-1 he[1~n]#include<cstdio>#include<iostream>#include<cstring>#include<vector>#include<algorithm>using namespace std;const int N=2e6原创 2016-11-30 23:16:59 · 281 阅读 · 0 评论 -
CodeForces 212D
线段树 对于每个数字,分别处理更新 区间修改+等差数列#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int N=1e6+100;typedef __int64 LL;LL add[N<<2],st[N<<2],cha[N<<2];#define ll o<<1#define原创 2016-11-17 12:35:53 · 409 阅读 · 0 评论 -
CodeForces 286D
扫描线+线段树 扫描线处理墙壁的交,取最早出现时间 线段树算出每段墙壁对每个时间的贡献 对于[l,r,t]的墙壁 t-l+1以后出现的蚂蚁会完整走完[l,r],[t-l+1,1e9]的答案增加r-l+1[t-r,t-l]成等差数列,线段树维护下就好#include<cstdio>#include<cstring>#include<iostream>#include<set>#incl原创 2016-11-14 11:10:47 · 279 阅读 · 0 评论 -
CodeForces 178C3
线段树模拟链表#include<cstdio>#include<iostream>#include<cstring>#include<map>using namespace std;typedef __int64 LL;const int N=2e5+10;#define ll o<<1#define rr o<<1|1#define mid (l+r)/2int clo[N<<2原创 2016-11-29 16:48:55 · 218 阅读 · 0 评论 -
CodeForces 173E
线段树 按能力值从小到大排序, 预处理以第i个人为组长的最大组 然后按能力值反向做更新线段树#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<vector>using namespace std;#define pb push_back#define ll o<<1#de原创 2016-11-29 15:35:10 · 222 阅读 · 0 评论 -
CodeForces 263E
基本思想是 预处理所有点的度数, 对于每个点预处理出所有和它相邻并且度数比它大的点 集, 每个点集大小为(√n)\sqrt(n) 每次操作(√n)\sqrt(n)#include<cstdio>#include<iostream>#include<cstring>#include<vector>#include<cmath>#include<map>using namespac原创 2016-11-29 15:08:47 · 266 阅读 · 0 评论 -
CodeForces 269D
线段树+dfs暴力更新线段树维护区间最高值, dfs区间询问 每次找到区间最高值把询问分成两半#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N=1e5+100;const int INF=1e9;#define ll o<<1#d原创 2016-11-29 14:35:52 · 325 阅读 · 0 评论 -
Codeforces 160E
给定n个三元组(si,fi,ti) 有m个询问也是三元组的形式(li,ri,bi) 对于每个询问,求满足sj<=li,ri<=fj and bi <=tj 的最小的tj 思路就是 按li一维排序,求满足ri<=fj and bi<=tj 的最小的tj 然后就可以二分tj 判断 ri<=fj 然后就是线段树怼一发#include<cstdio>#include<cstring>#in原创 2017-01-02 20:11:01 · 2140 阅读 · 0 评论 -
Codeforces 213E
给定两个全排列 |A|=n <= |B|=m 问有多少种不同的d使得数组A里面的所有值全部+d之后 是数组B的子序列 然后就是枚举+0,+1,+2,+3… hash判断一下 #include<iostream>#include<cstdio>#include<string>#include<cstring>#include<vector>#include<cmath>#inclu原创 2016-12-22 19:43:53 · 314 阅读 · 0 评论 -
Codeforces 431E
1.假如没有修改,直接排序, 然后二分答案,然后找到比答案小的最大的位置,然后求前缀和怼怼 2.有了修改,离散化权值,建线段树,剩下的一样#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N=1e5+10;typedef __int64原创 2016-12-24 22:08:28 · 287 阅读 · 0 评论 -
Codeforces 452F
哈希学到不好。。。 假如,a+c=2*b 对于比b小的数左高位右低位求hash 对于比b小的数低高位右高位求hash 当两个hash值完全一样就gg掉#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <algorithm>#include <set>#include <m原创 2016-12-24 17:17:38 · 365 阅读 · 0 评论 -
Codeforces 176E
树链剖分 增加一个或删除一个点 1.如果有其他路径经过它,它就对答案没有影响 2.其他情况就各种找lca 反正我已经看不懂我的代码了,就酱#include<cstdio>#include<cstring>#include<iostream>using namespace std;typedef __int64 LL;const int N=1e5+100;const int IN原创 2016-12-24 12:23:06 · 435 阅读 · 0 评论 -
Codeforces 260E
首先9!枚举儿子的位置, 1.画出水平的两根线,把平面分成三块,每块的个数是个固定值, 2.画出竖直的两根线,把平面分成三块,每块的个数是个固定值, 3.四根线合起来,计数 也不知道这个代码是复制谁的。。。#include<iostream>#include<cstdio>#include<map>#include<cstring>#include<cmath>#include<v原创 2016-12-23 17:05:08 · 323 阅读 · 0 评论 -
Codeforces 198E
线段树+set 这样就可以保证,每个爪子只被拿走一次,并且只更新一次, 并且更新的复杂度总的来说为n(logn)2n(logn)^2#include <cstdio>#include <iostream>#include <algorithm>#include <set>using namespace std;int i,j,k,X,Y,all,tot,n,M[250011],P[25原创 2016-12-23 16:52:09 · 280 阅读 · 0 评论 -
Codeforces 154D
分类讨论 if 可以一步杀死 else if如果a<=0 肯定是draw else 只能不断靠近 1.错过了 draw 2.一定有一个死#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int N=1e5+10;int aa[N],bb[N],id[N];int vis[N原创 2016-12-23 15:02:51 · 450 阅读 · 0 评论 -
Codeforces 685D
1.枚举x的取值范围[l,l+k-1],把所有位于这个范围的点存起来; 2.枚举所有的y取值范围[l,l+k-1],然后计数更新答案 3.复杂度仔细想想,还真是对的#include<cstdio>#include<iostream>#include<vector>#include<cstring>#include<algorithm>using namespace std;const原创 2016-12-23 12:24:10 · 283 阅读 · 0 评论 -
Codeforces 309B
倍增一下就好了#include<cstdio>#include<cstring>using namespace std;int a[1000005],nex[1000005],ans[1000005];char s[6000005];int n,r,c,t=1;void ksm(int x){ if(!x)return ; ksm(x>>1); for(int i原创 2016-12-23 09:41:22 · 285 阅读 · 0 评论 -
Codeforces 228D
1.对于每个z开一颗线段树 2.因为周期比较小,对于每一个节点维护在周期的不同位置区间和#include<iostream>#include<cstdio>using namespace std;#define ll o<<1#define rr o<<1|1#define mid (l+r)/2typedef __int64 LL;const int N=1e5+10;LL cc原创 2016-12-22 22:11:16 · 294 阅读 · 0 评论 -
HDU 5354
cdq#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;const int N=1e5+100;#define pb push_backint uu[N],vv[N];int fa[N],dis[N],sz[N];int cnt;int Find(int u)原创 2016-11-15 23:34:45 · 277 阅读 · 0 评论 -
CodeForces 526F
查询行区间得到列的最大最小值 查询列区间得到行的最大最小值 。。。。 然后就不TLE了#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N=3e5+100;typedef __int64 LL;int lg[N],mi[22];void init(){ lg[0]原创 2016-11-11 13:10:01 · 457 阅读 · 0 评论 -
CodeForces 632F
[http://blog.csdn.net/kirito_acmer/article/details/50791874]bitset#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<bitset>using namespace std;const int N=3000;int n;原创 2016-11-10 17:02:37 · 303 阅读 · 0 评论 -
点分治
////http://codeforces.com/problemset/problem/293/E#include#include#include#includeusing namespace std;typedef __int64 LL;const int N=1e5+10;struct Edge{ int v,next,w; Edge(in原创 2016-11-05 11:33:11 · 220 阅读 · 0 评论 -
后缀数组
//rk[0~n-1]:1~n sa[1~n]=0~n-1 he[1~n]#include#include#includeusing namespace std;const int N=1e5;int na[N],nb[N],ns[N],nv[N];int sa[N],he[N],rk[N];int cmp(int *r,int a,int b,int l){原创 2016-11-05 11:32:36 · 237 阅读 · 0 评论 -
后缀自动机广搜
///每个节点包含p->pre->step+1~p->step长度的子串#include #include #include #include using namespace std;const int N=250005;struct State{ State *pre,*go[26]; int step,num; void clear()原创 2016-11-05 11:32:04 · 188 阅读 · 0 评论 -
后缀自动机
#include#include#includeusing namespace std;const int N=1e5+10;struct Node{ Node *pre,*go[26]; int step; int num; void clear(){ memset(go,0,sizeof(go));num=0;pre原创 2016-11-05 11:31:25 · 176 阅读 · 0 评论 -
莫队
#include#include#include#include#includeusing namespace std;const int N=1e4+10;int block[N];struct Node { int l,r,id; bool operator<(const Node & th)const { if(block原创 2016-11-05 11:30:46 · 198 阅读 · 0 评论 -
树链剖分
#include#include#includeusing namespace std;const int N=1e5;const int M=N;struct Edge { int v,next; Edge(int v=-1,int next=-1):v(v),next(next){}}e[M*2];int head[N],total;vo原创 2016-11-05 11:30:06 · 162 阅读 · 0 评论 -
树状数组
#include#include#includeusing namespace std;const int N=1e3;int n,m;namespace AA{ int cc[N]; void add(int x,int v){ while(x<=n){ cc[x]+=v;x+=x&-x;原创 2016-11-05 11:29:20 · 175 阅读 · 0 评论 -
最小表示
int MinimumRepresentation(int *s, int n){ int i=0,j=0,k; while(i<n&&j<n){ k=0; while(s[(i+k)%n]==s[(j+k)%n]&&k<n) k++; if(k==n) return i; if(s[i+k]>s[j+k]原创 2016-11-05 11:28:36 · 217 阅读 · 0 评论 -
点更新主席树
///zoj 2112#include#include#include#includeusing namespace std;#define mid (l+r)/2#define w(i) T[(i)].w#define ls(i) T[(i)].ls#define rs(i) T[(i)].rsconst int N=60010;const int原创 2016-11-05 11:27:55 · 177 阅读 · 0 评论 -
treap
//poj 1442#include#include#include#include#include#includeusing namespace std;const int N=1000000+100;struct Node{ Node* son[2]; int rank; int size; int key;原创 2016-11-05 11:33:41 · 181 阅读 · 0 评论 -
splay
#include#include#includeusing namespace std;const int N = 300100;int aa[N];struct Node{ Node *ch[2],*pre; int sz,fg; int val;}node[N];int n_cnt;Node *null;void ini原创 2016-11-05 11:34:37 · 221 阅读 · 0 评论 -
CodeForces 232D
后缀数组+rmq+树状数组#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<vector>#include<cmath>using namespace std;const int N=2e5+100;int na[N],nb[N],ns[N],nv[N];int sa[N],原创 2016-11-10 11:23:42 · 304 阅读 · 0 评论 -
CodeForces 712E
线段树,区间并 定义 a:从区间左端出发,在不出左端的情况下,走出右端 b:从区间右端出发,在不出左端的情况下,走出右端#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int N=1e5+100;#define ll o<<1#define rr o<<1|1#define原创 2016-11-09 14:46:59 · 332 阅读 · 0 评论 -
ac自动机
////HDU 2457/////f[u]=r,r包含在u的后缀中/////last[u]=r,r包含在u的后缀中,并且是一个单词////每增加一个字母,状态转移一次#include#include#include#includeusing namespace std;const int inf=1<<25;const int MN=55*22+100;原创 2016-11-06 11:41:43 · 189 阅读 · 0 评论 -
块链
#include#include#includeusing namespace std;const int MAXL = 135000;const int BLOCKSIZE = 800;const int MAXBLOCK = 2*MAXL/BLOCKSIZE*2+100;int data[MAXBLOCK][BLOCKSIZE];int count[MAX原创 2016-11-06 11:41:25 · 391 阅读 · 0 评论 -
cdq
#include #include #include #include using namespace std ;const int N=300010;const int mod=1<<30;struct P{ int x,y,z; P(){} P(int xx,int yy,int zz){x=xx;y=yy;z=zz;}原创 2016-11-06 11:41:07 · 368 阅读 · 0 评论