
数据结构
文章平均质量分 77
IED98
这个作者很懒,什么都没留下…
展开
-
bzoj3572: [Hnoi2014]世界树
学习了一种新的树形结构——虚树,就是把每个树上是链的部分缩起来,再对这些在虚树上的点进行操。这题其实几天前就A掉了。。。只是题解还没写……这题有个很直观的想法,就是把询问点按dfs序排序,然后只保留相邻点的lca。然后再乱搞。。。然后有个很直观的感觉就是不可打(当然这是因为我太弱了。。。)然后去膜拜ydc神犇的代码。然后发现非常好写!然后还明白了这个东西叫做虚树。。原创 2015-01-13 23:19:59 · 1752 阅读 · 0 评论 -
bzoj2653: middle 主席树+线段树
主席树经典问题 cxlove讲得很详细了 http://blog.youkuaiyun.com/acm_cxlove/article/details/8566093#include #include #include #include using namespace std;#define pii pair#define mp make_pair#define maxm 2560005#d原创 2015-07-12 21:45:19 · 642 阅读 · 0 评论 -
bzoj1941: [Sdoi2010]Hide and Seek KD-tree
裸地kd-tree,所谓kd-tree就是暴力优化,把二维或多维德空间分块,然而树的形态可能会随着加点而退化,这时我们重建一下kd-tree就可以了。#include #include #include #include #include using namespace std;#define ll long long#define maxn 600000#define inf原创 2015-07-13 09:26:02 · 652 阅读 · 0 评论 -
bzoj2850: 巧克力王国 kd-tree
裸kd-tree,注意估价函数的写法,每个点记个sum。#include #include #include #include using namespace std;#define ll long long#define maxn 60000int read(){ int x=0,f=1;char ch=getchar(); while(ch'9'){if(c原创 2015-07-13 09:29:39 · 906 阅读 · 0 评论 -
bzoj2588: Spoj 10628. Count on a tree 主席树+dfs序
hzhwcmhf讲过,这个题是主席树,然后我当时说 按树链剖分那样弄,被否掉了,后来才发现,是dfs序,虽然没有很大差别,但仔细想想,树剖那样搞完全是多余。。。。以前的我太弱了。#include#include#include#include#include#define inf 0x7fffffff#define ll long long#define N 100005#de原创 2015-07-13 12:49:29 · 634 阅读 · 0 评论 -
bzoj3242: [Noi2013]快餐店 树形dp+线段树
对于不是环上的点我们可以用树形dp解决,剩下的就是在一个环上找距离最远的两点。我们可以拆环,几下每个点第一大和第二大的距离这样最长链就是max{sum[j]-sum[i]+dis[i]+dis[j]}。于是用两颗线段树分别维护max{sum[j]+dis[j]}和max{dis[i]-sum[i]}。然后更新答案。#include #include #include #inc原创 2015-07-13 12:21:22 · 1319 阅读 · 0 评论 -
bzoj3323: [Scoi2013]多项式的运算 splay
对于多项式的每一项 我们可以建一个节点记录其系数。然后这题就成了裸地模板题。求值操作直接o(n)搞。#include #include #include #include #include using namespace std;#define maxn 1000000+100#define maxm 100000+100#define INF 0x3f3f3f3f#defi原创 2015-07-13 12:29:55 · 642 阅读 · 0 评论 -
bzoj3932: [CQOI2015]任务查询系统 主席树
niabby讲过,不过niabby之后就退役了。。。。。。这个题离线后就是裸的主席树了(连删除操作都没有。。。)。然后怎么搞还要我说?空间要开这么大我也是醉了#include #include #include #include #include using namespace std;typedef long long sint;#define ss printf("orz\n")原创 2015-07-13 12:35:03 · 615 阅读 · 0 评论 -
bzoj3110: [Zjoi2013]K大数查询 树套数
写了个主席树套线段树 数据小,所以就过了23333#include #include #include #include #include using namespace std;int getint(){ int res;char c; while(c=getchar(),c'9'); res=c-'0'; while(c=getchar(),c>=原创 2015-07-13 12:45:39 · 709 阅读 · 0 评论 -
bzoj2434: [Noi2011]阿狸的打字机 trie+线段树
我们可以先按题目描述建出一个trie树,然后得到fall树,我们可以发现,fall树的子树里有#include #include #include #include using namespace std;#define maxn 110000#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define getmid int原创 2015-07-13 10:55:01 · 689 阅读 · 0 评论 -
bzoj2877: [Noi2012]魔幻棋盘 树套数+差分
神题,只能膜拜题解。然后发现了差分这个东西,所谓差分就是sigma{a[i]}=b[i]; a[i]=b[i]-b[i-1];(是不是和辗转相减很像。。。。。)我们再来看一下二维的怎么做。。然后我们换一种维护的方法。因为题目要求一定会查询到守护者a[x, y],所以我们以(x, y)为原点,建立直角座标系。二维的一样是得差分,对于第四象限的点:b[i, j] = a[i, j] - a[i-1原创 2015-07-13 11:41:18 · 1454 阅读 · 0 评论 -
bzoj2594: [Wc2006]水管局长数据加强版
离线处理后不难发现就是一个LCT询问两点间最大值最小值之类的,然后就上模板#include #include #include #include #include using namespace std;int getint(){ char ch = getchar(); for ( ; ch > '9' || ch < '0'; ch = getchar());原创 2015-07-13 12:47:25 · 1101 阅读 · 0 评论 -
bzoj2333: [SCOI2011]棘手的操作 线段树+离线
网上都是可并堆在线搞,其实直接离线处理处每个联通块,然后把他们放一起,然后点更新,区间询问就可以了。#include #include #include #include using namespace std;#define INF 100000000#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define get原创 2015-07-13 12:54:15 · 1501 阅读 · 0 评论 -
bzoj1146: [CTSC2008]网络管理Network 树套树
我还是太弱了,第一次碰主席树带删除的操作。首先我们按题目要求建一棵主席树(主席树只会是记前缀和),然后像COT那样用dfs序来维护,接着删除操作只是在树状数组上进行,树状数组只是记录每个点在原值的基础上加或减了多少。我们可以开个数组把子树都记下来,然后在二分的时候一边二分一边向下走就可以了。#include #include #include #include #include us原创 2015-07-12 21:32:09 · 631 阅读 · 0 评论 -
bzoj3176: [Coci 2012]Sort
我们不难发现,第一次操作之后序列就会变成一段上升,然后突然降下来,再不断上升的一个序列,然后序列每次就只能交换相邻两个错位的数,然后就成了统计逆序对的裸题。 #include#include#define LL long long#define maxn 210000using namespace std;int n;int a[maxn];int b[maxn];LL ans;原创 2015-07-12 21:26:20 · 947 阅读 · 0 评论 -
3674: 可持久化并查集加强版 可持久化线段树
突然脑抽:今天学学持久化segtree吧,于是就有了这篇博客。可持久化segtree用了splay的动态加点的思想,把两棵树相同的部分共用,这样有效地节省了空间。#include #include #include #include #include #include using namespace std;int getint(){ int res;char c;原创 2015-01-17 03:36:02 · 690 阅读 · 0 评论 -
bzoj2286: [Sdoi2011消耗战] 虚树构造
首先我们考虑每次都做一遍树形DP(树形DP自己脑补去,随便乱搞就过了)。显然这是TLE无疑的。由于要改变的节点个数很少,我们可以考虑用虚树重新建图,缩小范围,这样一棵树上最多有m*2个节点然后每次对虚树进行树形dp这样总的复杂度就是n*logn的了,logn是lca的复杂度。然后就是各种细节的地方了。。。。。#include #include #include原创 2015-01-15 12:47:29 · 2320 阅读 · 0 评论 -
bzoj3611: [Heoi2014]大工程 虚树+树形dp
题目大意:给定一棵树,m次询问,每次给出k个关键点,询问这k个点之间的两两距离和、最小距离和最大距离n思路:利用LCA单调性,每次询问的时候重新建树,在这棵树上做DP,使得总体时间复杂度降到O(nlogn)。我的做法是维护四个数组,sum,size,_min,_max,分别表示以当前节点为根节点的子树中的所有关键点到根节点的距离的总和,共有多少个原创 2015-01-17 05:40:45 · 1245 阅读 · 7 评论 -
bzoj2223: [Coci 2009]PATULJCI 主席树
第一个是位置的个数,第二个是最大值,n个数后才是询问次数m.......用可持久化线段树记录某个区间里的个数,一开始插入的时候就要维护一个可持久化线段树。然后二分答案,每次将x和y向目标区域移动,当x==y时就是某个特定的数的个数了。然后判断即可。本题同3524.#include #include #include #include using namespace std;i原创 2015-01-21 20:54:38 · 612 阅读 · 0 评论 -
BZOJ 2002 弹飞绵羊 Link-Cut-Tree(LCT)
首先这个序列从右往左捋一下肯定是一棵树。错了不对,是一颗森林。而第二个操作可以随时改变这棵森林的结构于是这道题很明显是动态树结构中的Link-Cut-Tree。关于LCT的概念网上有很多 这里只列出一个关键点就是如何找到链顶的父节点其实虽然这个算法的实现方式是对每一条重链(想不出名字来了,就沿用轻重链剖分的名字吧)维护一棵Splay,但实质上每一原创 2015-02-05 15:26:27 · 849 阅读 · 0 评论 -
bzoj3226: [Sdoi2008]校门外的区间 线段树
由于知识最后一次询问,这样简化了操作。所有操作都可用取并和取交完成。第一个操作就直接把区间标记为1.第二个操作就把T左边的区间和T右边的区间取反。第三个操作就把T区间取反第四第五个操作类似。#include #include #include #include #include using namespace std;#define n (65536*2+1)#d原创 2015-02-21 21:24:07 · 551 阅读 · 0 评论 -
bzoj3669: [Noi2014]魔法森林 LCT
题解:暴力的想法是枚举a的上界,做b的最小生成树。而且有一个比较显然的性质是:如果可以在一个生成树中加入一条边,使得树的总权值更小,那么一定是(设这条边连接 x,y)x--y原路径上的最大权值删掉这条边,加上新边。那么我们只需要用LCT,维护点与点之间的最大权值,将边以a排序,一条一条试图往里面加即可。如果x,y不连通直接加入,否则按上述查询x,y的最大值,比较。然后每原创 2015-02-20 10:42:59 · 685 阅读 · 0 评论 -
bzoj1500: [NOI2005]维修数列
今天比较闲所以把这个题拿来练练手。从晚9点写到12点半然后改到凌晨2点终于改完。。。。最后还被大神说是写得快的了 说byvoid大神写了两个早上加一个下午。。。。前几个操作都很简单之接搞就可以了。对于最后一个操作我们可以用类似于线段树区间合并的标记来做。lmax和rmax,mmax表示左边区间以左开头和以右结尾和中间的最大和。rever后记得要swap(lmax,rmax)哟,还有要用一个原创 2015-02-14 23:09:49 · 729 阅读 · 0 评论 -
bzoj2518: [Shoi2010]滚动的正四面体 线段树
写这个题的同学请提前做好心理准备。此题堪称史上最烦人的线段树了,和bzoj1018差不多。都是上海的线段树。尼玛为何都这么丧心病狂。。。结合14年的三叉神经树,上海的数据结构虽然都还停留在线段树阶段但代码量都是在250+,无力吐槽。说说这个题怎么做吧。首先我们可以模拟出初始序列的样子。我大了一个表a[I][J][K]代表i为底面j为朝向我们的面向三个方向转后底面是哪个面。最好自己拿一个正四面体原创 2015-02-14 23:17:43 · 911 阅读 · 0 评论 -
bzoj1798: [Ahoi2009]Seq 维护序列seq 线段树
好久没有写线段树了,所以看到这个题就直接写了。。。然后发现脑残了。一直TE。。。。。然后想起来只要往下乘的时候都换成ax+b就可以了。。#include #include #include #include #include using namespace std;#define getmid int mid=(l+r)>>1#define lson l,mid,rt<<1#d原创 2015-03-20 10:26:00 · 488 阅读 · 0 评论 -
bzoj2836: 魔法树 树链剖分
就是上题中我说过得类似的操作。。。本题只有加和询问操作。#include #include #include #include #include using namespace std;#define ss printf("orz\n");#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define INF 0x3f3原创 2015-03-23 21:49:20 · 613 阅读 · 0 评论 -
bzoj2157: 旅游 树链剖分模板题
今天考试碰到一个树链剖分的模板题,由于脑抽一时忘记了整个子树是怎么修改的。。。。其实就是加上个siz。。。。然后就找了一个操作比较全的树链剖分切了。。。。#include #include #include #include #include using namespace std;#define lson l,mid,rt<<1#define rson mid+1,r,rt<<原创 2015-03-23 20:49:55 · 877 阅读 · 0 评论 -
bzoj2733: [HNOI2012]永无乡 splay+启发式合并
正解不是splay,但标解是splay+启发式合并。所谓的启发式合并就是把size小的往大的splay上加,复杂度是nlog2n。由于无需知道根所以直接看此节点有没有父亲节点就可以判断是不是根。#include #include #include #include #include using namespace std;#define maxn 120110int fa[max原创 2015-02-07 20:47:12 · 769 阅读 · 0 评论