===数据结构===
Loi_a
这个作者很懒,什么都没留下…
展开
-
平衡树
#include<iostream>#include<cstdio>#include<map>using namespace std;map<int,int> bh;int key[100010];int fa[100010];int ch[100010][2];int sz[100010];int cnt[100010];int t1,t2,tot,root;int inf=原创 2016-04-15 08:17:25 · 444 阅读 · 0 评论 -
bzoj 3236 作业 莫队
题意:长度为n的序列,m次询问,每次给出l,r,a,b,求在[l ,r]区间内权值在[a ,b]区间的元素个数以及去重后的个数。 第一眼,这不是线段树套Splay裸题吗,码了半天,不对啊,去重没法做。想了想,权值套区间线段树可做,又码了半天,第二步还是不会做。忽然发现可以莫队,96s在bzoj卡过了。这道题树套树是可以做,正解好像是再分块优化莫队,使得端点移动变成O(1)。(专治数据结构学傻!)#原创 2017-01-02 16:08:42 · 354 阅读 · 0 评论 -
bzoj 3196 二逼平衡树 树套树
都是泪,调了一晚。代码能力++。 查询区间排名k,时间复杂度nlog³n,bzoj能A,但是tyvj TLE 两个点,求各路大神指错打脸。 另外推荐一个OJ cojs.tk 给数据,很良心。#include<iostream>#include<cstdio>#include<algorithm>#include<stack>#define maxn 1000005//#原创 2016-09-26 21:45:41 · 423 阅读 · 0 评论 -
bzoj 2141 排队 树套树
交换位置L,R,对答案产生的影响是L,R内(比L大的数个数-比L小的数个数)+(比R小的数个数-比R大的数的个数)+(L和R交换后应该+1或-1)。求这个东西用树套树就可以(做数据结构做傻了,还有很多其他优秀的做法)。#include<iostream>#include<cstdio>#include<algorithm>#define maxn 1700005using namespace原创 2017-01-03 18:57:12 · 387 阅读 · 0 评论 -
bzoj 3339 Rmq problem 离线+线段树
首先可以在O(n)的时间内求出1~i(for i 1~n)的答案ans[ i ]。然后对于l~r的答案与l+1~r答案的关系,把i~nxt[ i ]-1的所有大于a[i]的ans都改为a[i]就可以了,nxt[ i ]表示下一个最近的 值也是a[i]的位置。询问排一下序。#include<cstdio>#include<iostream>#include<algorithm>#define m原创 2017-01-03 19:13:08 · 279 阅读 · 0 评论 -
bzoj 3110 K大数查询 整体二分
#include<cstdio>#include<iostream>#define maxn 50005#define LL long longusing namespace std;int n,m;struct Que{ int op,l,r,x,id; void read() { scanf("%d%d%d%d",&op,&l,&r,&x);原创 2017-01-03 19:15:47 · 438 阅读 · 0 评论 -
bzoj3524/2223 主席树
给一个长度为n的序列a。1≤a[i]≤n。 m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2。如果存在,输出这个数,否则输出0。#include<iostream>#include<cstdio>using namespace std;struct zxs{ int l,r,cnt;}tree[10000005];int t原创 2016-12-19 08:31:06 · 449 阅读 · 0 评论 -
bzoj2588 count on a tree 主席树
在树上建主席树,每个点以它的父亲节点作为历史版本。#include<iostream>#include<cstdio>#include<algorithm>#define maxn 200005using namespace std;struct E{ int to,nxt;}b[maxn<<1];int fst[maxn],tot=1;void build(int f,in原创 2016-12-20 07:44:58 · 423 阅读 · 0 评论 -
noip2016 蚯蚓 智商题
由于D1爆炸,所以D2就没去想正解,只想着打暴力,于是又GG。首先可以想到优先队列,在外面记录delta。可以做到mlogm,但是m太大。 然后我又去想,q=0既蚯蚓不会变长的时候,切出来的两端蚯蚓分别是单调递减的。 一个不那么显然的事情,q!=0的时候这也是成立的(想一想就明白了,难受)。#include<iostream>#include<cstdio>#include<algorith原创 2016-12-20 16:16:58 · 819 阅读 · 0 评论 -
poj 2201 笛卡尔树
这个数据结构看上去非常巧妙,不过没有找到实用的例题。。。。#include<iostream>#include<cstdio>#include<algorithm>#define maxn 50005using namespace std;struct Pair{ int key,aux,id; int fa,ch[2]; void print() {pr原创 2016-12-31 19:33:41 · 483 阅读 · 0 评论 -
hdu 1512 左偏树
题意大概是有n只猴子,m次矛盾,a和b产生矛盾时,如果他们不认识,就会找各自认识中最强壮的猴子打架,然后打架的猴子权值减半,这两拨猴子就互相认识了,成了一群猴子,每次求合成一群后的最大权值。#include<iostream>#include<cstdio>#define maxn 100001using namespace std;int f[maxn];int find(int x)原创 2016-12-31 19:55:35 · 468 阅读 · 0 评论 -
bzoj 3282 Tree 动态树LCT
学了一天LCT,还是不太明白,打(抄)了一个模板,先存着。#include<iostream>#include<cstdio>#include<algorithm>#include<stack>#define maxn 300005using namespace std;inline void read(int &a){ a=0;char c=getchar(); wh原创 2016-09-27 15:30:30 · 443 阅读 · 0 评论 -
bzoj 2631 tree LCT+标记处理
这个题目名字好大众啊。 从昨天下午开始码,刚调出来。 由于LCT常数很大,一定要丧心病狂的优化常数,非常管用。#include<iostream>#include<cstdio>#define LL unsigned int#define P 51061#define maxn 200005using namespace std;int n,q;int fa[maxn],ch[ma原创 2016-09-28 08:15:00 · 399 阅读 · 0 评论 -
hdu 2475 box LCT
题意是箱子套箱子,每次移动箱子x到箱子y里,或询问x最外层的箱子。 这一道题根是固定的,不能换根。#include<iostream>#include<cstdio>#include<cstring>#define maxn 50005using namespace std;int fa[maxn],ch[maxn][2];int f[maxn];bool isroot(int x)原创 2017-01-01 10:56:45 · 411 阅读 · 0 评论 -
hdu 4010 LCT
注意标记下放时,子节点不为零时再下放,不然统计的时候会出问题……#include<iostream>#include<cstdio>#include<cstring>#define maxn 300005using namespace std;int fa[maxn],ch[maxn][2];int val[maxn];int Max[maxn],add[maxn];struct l原创 2017-01-01 15:15:35 · 414 阅读 · 0 评论 -
bzoj 3100 K大数查询 树套树
外层权值线段树,对于每个权值线段树节点,建立区间线段树。但是内层这样普通建树会TLE&&MLE。仔细想会发现,区间线段树不用都建出来,用到哪个点就开哪一个点,每次操作最多经过logn个权值线段树节点,访问每个权值线段树节点时,最多修改logn个区间线段树节点,所以区间线段树总节点个数nlog²n。注意longlong。#include<iostream>#include<cstdio>#incl原创 2017-01-01 22:34:33 · 461 阅读 · 0 评论 -
zjoi2007棋盘制作 单调栈
和玉蟾宫一模一样。http://blog.csdn.net/loi_a/article/details/52699047#include<cstdio>#include<iostream>#include<stack>#define LL long longusing namespace std;int a[2005][2005];int s[2005][2005];stack<int原创 2016-11-02 15:13:22 · 561 阅读 · 0 评论 -
bzoj 3039 玉蟾宫 单调栈
。#include<iostream>#include<cstdio>#include<stack>using namespace std;int mp[1005][1005];char c[2];int h[1005][1005];stack<int> S;int main(){// freopen("jademoon.in","r",stdin);// freopen(原创 2016-09-29 10:04:53 · 676 阅读 · 0 评论 -
应该没有大问题(坑)
int key[100005];int fa[100005];int ch[100005][2];int root,tot,t1,t2;bool dir(int x){ return x==ch[fa[x]][1];}void rotate(int x){ bool b=dir(x); int y=fa[x]; int z=fa[y],a=ch[x][原创 2016-07-25 21:58:19 · 433 阅读 · 0 评论 -
CF #368 D Persistent Bookcase 操作树~?
Recently in school Alina has learned what are the persistent data structures: they are data structures that always preserves the previous version of itself and access to it when it is modified. Afte原创 2016-09-04 20:32:16 · 420 阅读 · 0 评论 -
bzoj 2733 永无乡 Splay 启发式合并
题目大意:n(n<=10w)个点,每个点都有重要度,q(q<=30w)个操作。1.每次连接2个点。2.查询a,k;与a相连的第k重要是哪一个点,不存在输出-1。 查询可以Splay搞,修改暴力启发式合并,因为每次合并size翻倍,所以每个点最多被合并logn次。复杂度nlog²n。#include<cstdio>#include<iostream>#include<cstdlib>#defi原创 2016-09-24 15:17:05 · 702 阅读 · 1 评论 -
poj2104 K-th number 主席树模版
这个题以前分块做,学了主席树(抄模版),存一下;#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int a[100005];int L[100005];struct zxs{ int l,r,cnt;}tree[5000005];int tot=1;int rt[100005]原创 2016-08-16 09:54:07 · 336 阅读 · 0 评论 -
bzoj1503郁闷的出纳员 Splay
Splay维护插入,删除,由排名找值,裸题。 但是比较坑的一点是最后统计离开人数的时候,刚进来就离开的人是不计入答案的(再次重复我语文不好)。直接上代码。#include<iostream>#include<cstdio>using namespace std;int ch[100005][2];int fa[100005];int sz[100005];int key[100005]原创 2016-07-28 15:24:53 · 377 阅读 · 0 评论 -
bzoj 1012 最大数 线段树 || 分块
线段树提前开20w个点建树就可以直接修改。#include<iostream>#include<cstdio>#define LL long longusing namespace std;struct xds{ int l,r; LL ma;}tree[800005];void build(int dq,int l,int r){ tree[dq].l=l;原创 2016-09-26 17:10:34 · 341 阅读 · 0 评论 -
bzoj 1067 降雨量 线段树
用线段树维护区间最大,用map搞一搞判断,和离散化差不多,我语文不好。#include<iostream>#include<cstdio>#include<map>#include<algorithm>using namespace std;map<int,int> mp;int ni[50005];struct xds{ int l,r,sum; int num,m原创 2016-09-26 17:18:47 · 374 阅读 · 0 评论 -
bzoj 1208 宠物收养所 Splay
我当时脑子一抽,用map查一个数值的编号,多一个log,貌似不影响AC。#include<iostream>#include<cstdio>#include<map>using namespace std;map<int,int> bh;int fa[80005],ch[80005][2];int sz[80005],key[80005];int t1,t2;int inf=2147原创 2016-09-26 17:22:17 · 494 阅读 · 0 评论 -
Codeforces 365Div2 D Mishka and Interesting sum
http://codeforces.com/problemset/problem/703/D 题意是给一个序列,多次询问一段区间内出现偶数次数的数字的异或和。n,m<100w,时限3.5s。这样好像是卡 莫队n*sqrt(n)做法。可以nlogn做。 input 7 1 2 1 3 3 2 3 5 4 7 4 5 1 3 1 7 1 5 o原创 2016-11-03 19:25:16 · 391 阅读 · 0 评论 -
LCT学习笔记
动态树问题: 动态加边,删边,始终保持是一棵或多棵树。 支持换根,修改点、边、路径权值(等信息),查询路径权值等。思想:把树分成若干个部分维护。和树链剖分相似,树链剖分的一些题目也可以用LCT来做。LCT的均摊复杂度是log²n,杨哲的论文(百度搜一下,%大神)有证明,但我太弱,看不懂,也不想研究……一些定义: access(x) :访问x,这个操作是LCT关键; Preferred ch原创 2016-09-28 10:41:48 · 626 阅读 · 2 评论 -
bzoj 1180 [CROATIAN2009]OTOCI - LCT
20分钟码完,手速++; 不过这道题正解是LCT吗,感觉很奇怪啊。#include<iostream>#include<cstdio>#define maxn 30005using namespace std;int fa[maxn],ch[maxn][2],rev[maxn];int sum[maxn],v[maxn];bool dir(int x){return x==ch[fa原创 2016-09-28 11:29:24 · 336 阅读 · 0 评论 -
bzoj 2002 弹飞绵羊 LCT
先吐槽一句,这题分块比LCT快是什么鬼,LCT常数是有多大。LCT1.8s,分块总耗时1.6s。 主要思路:link(i,i+a[i]);弹出去的都连向节点n+1; 每次修改cut,link。查询是 以n+1为根,access(x),splay(x),x的子树大小,就是x点向后弹的节点数。#include<iostream>#include<cstdio>#include<algorithm原创 2016-09-28 19:04:35 · 394 阅读 · 0 评论 -
bzoj 3223 文艺平衡树 Splay
Splay维护区间翻转裸题,但还是调了很长时间。#include<iostream>#include<cstdio>#define maxn 100005using namespace std;int rev[maxn],fa[maxn],ch[maxn][2];int sz[maxn];int root;bool dir(int x){return x==ch[fa[x]][1];原创 2016-09-29 10:00:32 · 366 阅读 · 0 评论 -
bzoj 3155 Preprefix sum 树状数组
非常神奇的题目啊,我语文不好,所以不写题解了。#include<iostream>#include<cstdio>#define LL long longusing namespace std;int n,m;LL a[100005];LL c[100005];void change1(int x,LL d){ while(x<=n) { c[x]+=原创 2016-09-29 11:14:10 · 414 阅读 · 0 评论 -
bzoj 3295 动态逆序对 CDQ分治
每删除一个数对答案的影响是 前面比他大的数的个数+后面比他小的数的个数。问题变成了插入一个数并求出前面有多少数比他大(后面小的数可以用同样方法求)。 首先这可以用一个二维数据结构做。 CDQ分治的强大之处在于它能够压掉一维。它的主要思想是把操作分为两部分,计算前半部分修改对后半部分询问影响,然后递归处理两部分。 我这个代码写的太丑了,调了一天,,,还不如去写树套树>_<。#include<cs原创 2017-04-21 11:53:58 · 403 阅读 · 0 评论