Patrickpwq的数据结构专栏
收集各种数据结构的题目
Patrickpwq
这个作者很懒,什么都没留下…
展开
-
【NOIP 2013】货车运输(Kruskal+lca)
传送门Solution:一辆车的载重,取决于他到终点上的路的载重最小值,最小值越大,装的就越多考虑如何找路径,如果bfs或者dfs的话,TLE。这时想到,我们可以做一颗最大生成树(按照权值从大到小排序),在生成树的基础上,两点之间都是联通的,而且载重也是最优的。这时考虑如何在生成树上找到两点的路径,一棵树,自然而然地就想到了LCA,然后就AC了。#in...原创 2018-07-31 14:46:00 · 137 阅读 · 0 评论 -
【LUOGU P2574】XOR的艺术(线段树xor)
传送门只需要对懒标记做文章,每次xor1,并且我们可以发现,一个区间xor1后权值和变为了l-r+1-sum,知道这两个这道题就可做了。#include<bits/stdc++.h>#define N 200005using namespace std;int n,m,a[N];struct node{ int l,r,v,laz...原创 2018-07-31 15:27:00 · 164 阅读 · 0 评论 -
【LUOGU 2253】好一个一中腰鼓(线段树上dp)
传送门Solution:考虑在区间维护五个值:一个是le 代表从左端点开始向右的最大01序列一个是ri 代表从右端点开始向左的最大01序列一个是all 代表整个区间最大的01序列(可以不含左,右端点)xl 代表区间左端点的值xr 代表区间右端点的值这样之后,每次push_up,判断左儿子的xr是否与右儿子的xl构成异或关系,如果是的话,就可以更新all,le,ri了。#...原创 2018-07-31 15:35:00 · 147 阅读 · 0 评论 -
【LUOGU P4513】小白逛公园(线段树上dp)
传送门Solution:与上一题十分类似的,我们考虑维护一个节点的区间从左到右包含最左端点的最大值,以及从右到左的最大值,以及整体的最大值,以及当前区间的权值和。不过方便一点,我们不用再去维护区间左右端点的值,因为有了区间的权值和,父节点的lmax=max(lson.lmax,lson.v+rson.lmax)即可,不必再麻烦的去特判左右端点。#inclu...原创 2018-07-31 16:07:00 · 136 阅读 · 0 评论 -
【POJ 2352】Stars(树状数组)
传送门由于输出中的y还是单调递增,甚至还不用排序了。我们用树状数组维护一个类似桶的东西即可,在update,注意是i=x;i<=32000,而不是n另外,由于x有可能为0,注意lowbit(0)会炸掉,因此给x++来避免特判。#include<iostream>#include<cstdio>#include<cstring>usi...原创 2018-08-04 20:21:00 · 135 阅读 · 0 评论 -
逆序对(树状数组解决)
传送门Solution:由于数字的大小可能非常大,而且都是未知的,所以只能采用离散化的方式先将数组离散化。每次把这个数的位置加入到树状数组中,因为是排完序之后,所以之前加入的一定比后加入的大然后再查询当前这个数前面位置的数。#include<bits/stdc++.h>#define N 40005using namespace std;...原创 2018-08-04 21:40:00 · 188 阅读 · 0 评论 -
【POJ 2481】Cows(离散化+树状数组)
传送门就是stars的变式。把e,s当成一个点的横坐标,纵坐标后,经过画图会发现,所要求的点,其实就是一个点的左上方。按y从大到下排序,然后树状数组维护一下类似桶的东西即可。#include<iostream>#include<cstdio> #include<cstring>#include<algorithm>using...原创 2018-08-05 09:27:00 · 125 阅读 · 0 评论 -
【POJ 1195】Mobile phones(二维树状数组)
传送门就是一个二维树状数组单点修改+区间查询的模板题,代码特别好实现,可以来练练手。#include<iostream>#include<cstdio>#include<cstring>using namespace std;int trash,n,tree[1050][1050]; inline int lowbit(int x){...原创 2018-08-05 22:48:00 · 137 阅读 · 0 评论 -
【JLOI2014】松鼠的新家(lca+树上前缀和)
传送门对于这道题,我们不难想到,对于两个点,我们可以求出他们的lca,然后顺着链暴力往上修改。但是这样时间复杂度是很不乐观的,最多可以达到n^2。这里介绍一种可以用来修改树上路径的方法——子树前缀和。设定一个修改数组change。如果要对x到y路径上的所有点权值+k,lca为z。那么change[x]+=k,change[y]+=k,change[z]-=...原创 2018-08-11 10:26:00 · 151 阅读 · 0 评论 -
【POJ 3321】Apple Tree(树的dfs序+树状数组)
传送门Solution:我们只需要采用和树链剖分近似的思想——把整个树的dfs序整理出来,排成线型。这样一个节点的子树肯定是连续的一段,于是乎就可以用树状数组维护单点修改+区间查询的任务了。#include<iostream>#include<cstdio>#define N 100005using namespace std...原创 2018-08-13 11:11:00 · 175 阅读 · 0 评论 -
【ZJOI2008】树的统计(树链剖分)
传送门Solution:就是树链剖分入门题啦~// luogu-judger-enable-o2#include<bits/stdc++.h>#define N 30005#define M 200005#define lson now<<1#define rson now<<1|1#define INF 0x...原创 2018-08-13 13:09:00 · 109 阅读 · 0 评论 -
【NOIP2015】运输计划(二分+lca+树上差分)
传送门不得不承认noip的题出的是真的好n=300000,m=300000的极限数据不由得想到某种nlogn的做法这道题乍一看和二分没有一点关系,然而我们仔细想想后发现,对于一个时间t1,如果t1之内可以完成,那么t2肯定也能完成!满足单调性,因此我们可以二分时间,那么如何check呢?首先,对于一个t,那么所有m必定分为两类——耗时超过t,耗时小于等于...原创 2018-08-14 11:49:00 · 129 阅读 · 0 评论 -
【NOIP校内模拟】图论题
设dis[i]表示根节点到i的距离(只经过树边),再设w[i]表示i到1这条边的距离对于u和v我们考虑两种情况①.当u是v的祖先 则答案为dis[v]-dis[u]②.当u不是v的祖先,明确从1到v的路径是唯一的又分两种情况1.u通过自己,跳到了1节点,然后走这条唯一路径,答案为w[u]+dis[v]2.u通过自己的子树,跳到了1节点,然后走这条...原创 2018-09-29 23:36:00 · 140 阅读 · 0 评论 -
【NOIP校内模拟】相遇
【问题描述】 豪哥生活在一个 n 个点的树形城市里面,每一天都要走来走去。虽然走的是比较的 多,但是豪哥在这个城市里面的朋友并不是很多。 当某一天,猴哥给他展现了一下大佬风范之后,豪哥决定要获得一些交往机会来提升交 往能力。豪哥现在已经物色上了一条友,打算和它(豪哥并不让吃瓜群众知道性别)交 往。豪哥现在 spy 了一下这个人的所有行程起点和终点,豪哥...原创 2018-10-05 23:37:00 · 151 阅读 · 0 评论 -
[SHOI2012]魔法树 之 错误解法
这是传送门 我的解法会被卡TLE 但是很有意义 子树查询+链上修改 对于链加,可以看作是一个点到根上的路径加。 一个修改 (x,W) 对 y 有贡献当且仅当 y 为 x 的祖先。且贡献为 (depx − depy + 1) ∗W。 拆开括号即为 depx ∗W+ (1 − depy) ∗W。(W是各个点被...原创 2018-10-06 16:48:00 · 158 阅读 · 0 评论 -
【luogu P3391】文艺平衡树
QWQ传送门 要在Splay中修改区间的话,可以先查找size值为l与r+2的两个节点,将一个旋转到根,另一个旋转到根的右儿子上,则要修改的区间就是根的右孩子的左子树 然后直接打翻转标记即可,翻转标记类似于线段树的懒标记,查第k大的时候pushdown,pushdown就是把左儿子,右儿子的位置交换 #include<...原创 2018-10-07 16:59:00 · 161 阅读 · 0 评论 -
【SDOI2011】染色(树链剖分)
很好的一道题 就是代码几百年都调不出来 首先可以想到树链剖分维护 其次怎么维护呢?我们可以魔改一下线段树 联想到线段树求最大子段和的做法 另外维护左右两个端点 合并的时候特判一下 这道题也是类似 我们维护左右端点的颜色 在合并左右儿子时候 如果左儿子的右端点=右儿子的左端点 那么当前节点的连续颜色数就会- - 那么类似的 在...原创 2018-10-15 11:16:00 · 114 阅读 · 0 评论 -
【NOIP校内模拟】T3 长者(主席树+哈希+二分)
我们先考虑如何比较两两的字符串我们可以用线段树来维护哈希值 在线段树上根据二分的性质来做即可又考虑到 每颗线段树是在之前的某颗基础上只修改了一个节点 那显然就想到了主席树另外说说如何pushup 我们考虑这样一个字符串 abcdefg假设当前节点左儿子是abc 右儿子是defg由于我们的哈希值用的是unsigned long long 自然溢出大法 也就是说abc的哈希值是a(...原创 2018-10-16 17:32:00 · 110 阅读 · 0 评论 -
【洛谷P3834】【模板】可持久化线段树 1(主席树)
几个月没打了...全忘光记得之前写过一篇主席树入门教程 https://blog.csdn.net/Patrickpwq/article/details/80315358显然里面的代码丑的不能看重发一个代码主席树推荐不要写结构体// luogu-judger-enable-o2#include<bits/stdc++.h>#define ...原创 2018-10-16 20:38:00 · 115 阅读 · 0 评论 -
【CQOI2015】任务查询系统(主席树+差分)
这是一道好题 可以更深的理解主席树最初的想法是 一开始 一边加入任务 一边维护时间轴换句话说 对于每个时间点 我们都想维护一颗权值线段树(这里的权值代表着优先级Pi)相当于对于一个任务 我们要维护Ei-Si棵然而显然MLE 考虑降维联想到主席树建树方式是通过前缀和来的既然是求前缀和 这道题的每个任务相当于区间修改 会不会与差分数组有关呢?答案是正确的所以一开始我们想维护的E...原创 2018-10-16 22:24:00 · 96 阅读 · 0 评论 -
【BZOJ2588】Count on a tree(主席树+树上差分)
我们直接在dfs的时候顺便建主席树 维护一个节点到根路径上的节点出现情况对于查询(u,v)用u点的主席树+v点的主席树-lca(u,v)的主席树-lca(u,v)父节点的主席树,在这样产生的主席树上查找第k小的排名,最后输出它原来的点权。lca我选择了树链剖分#include<bits/stdc++.h>#define N 100005using namespac...原创 2018-10-18 14:03:00 · 132 阅读 · 0 评论 -
【HDU 3308】LCIS(线段树合并)
维护一个区间的包含最左的元素的LCIS,包含最右元素的LCIS,以及整个区间的LCIS,然后pushup的时候就更新这三个值就行了。注意要考虑左右儿子可以“接”起来的情况等等查询的时候要注意,也要考虑左右可以“接”起来时候,不过还要注意,有可能左右儿子边界的已经“越界了”,就是超过了查询范围,还要取个min,这道题坑就坑在这儿#include<bits...原创 2018-10-18 20:43:00 · 95 阅读 · 0 评论 -
【HDU 5828】Rikka with Sequence(线段树维护区间开方,修改,求和)
首先我们知道一个数开7 8次方过后就歇逼了那我们是否可以维护一个区间的flag标记 表示是否一个区间里的数都是一样的 那开根就到这儿就行了(似乎在口胡?)然后我们看一组数据2 3 2 3 2 3然后整体加6然后开根号,又会变回2 3 2 3 2 3相当于不会出现区间数字一样的情况了,这样就相当于没剪枝,就T了然后发现只有极差为1的时候才会出现这种情况,...原创 2018-10-22 21:03:00 · 199 阅读 · 0 评论 -
【hdu 6183】Color it(线段树动态开点)
考虑到颜色只有50种所以我们开50棵线段树 然后对于每次询问 循环50次对于每一个颜色的线段树询问那如何查询啊你考虑到每次询问的最左边都是1也就是说只需要对于每种颜色的纵坐标 维护往右出现过的点的横坐标的最小值然后就是区间(y1,y2)查询最小值 判断是否超过了x但是会MLE啊所以动态开点 复杂度为nlogn#include<bits/std...原创 2018-10-22 22:47:00 · 156 阅读 · 0 评论 -
【NOIP 校内模拟】行星通道计划(二维树状数组)
两个管道相交是啥情况?有环展链 我们把环展成链过后 发现只会出现如下图两种情况然后我们维护二维BIT1:表示左端点小于等于x 右端点小于等于y的个数BIT2:左端点大于等于x 右端点小于等于yBIT3:左端点大于等于x 右端点大于等于y查询就很简单了对于操作1相当于一个更新#include<bits/stdc++.h>#define ...原创 2018-10-23 16:43:00 · 150 阅读 · 0 评论 -
【BZOJ 3155】Preprefix sum(树状数组)
显然是不能直接开两个树状数组维护 前缀和,前缀和的前缀和。因为一旦对a[i]进行修改,将会影响许多位前缀和的前缀和我们考虑对式子变一下形Qi =S1+S2+S3+...+Si =a1+a1+a2+a1+a2+a3+...+ai =a1*i+a2*(i-1)+a3*(i-2)+...+ai* =(a1+a2+a3+...+ai)*i ...原创 2018-10-25 15:57:00 · 130 阅读 · 0 评论 -
【BZOJ1106】【POI2007】立方体大作战tet(树状数组+贪心)
贪心策略:每加入一个数,如果之前已经存在它了,就直接交换因此我们需要维护距离 就用树状数组好了注意是2n#include<bits/stdc++.h>#define N 100005using namespace std;int n,tree[N],pre[N],ans;inline int lowbit(int x){ ret...原创 2018-10-25 22:15:00 · 146 阅读 · 0 评论 -
【BZOJ3732】Network(Kruskal重构树)
发现我还naive的不会Kruskal重构树所谓Kruskal重构树 就是在做Kruskal的时候 构造一颗树 对两个即将合并的联通块 新建一个节点 作为这两个联通块的父亲 且这个节点的权值就是那条相连两个联通块的权值而且这棵树很明显是一个堆那么对于最初的最小生成树 两个节点路径上的最大/小值 就是重构树上他们的lca然后就可以解决这道题了#includ...原创 2018-10-26 17:44:00 · 150 阅读 · 0 评论 -
【洛谷P4315】月下“毛景树”(树链剖分)
这是一道毒瘤题。首先题目中给的是边权而不是点权,但是我们把边权移到点上就行了但是要注意,之后我们修改u,v两点之间的路径时,就不要修改他们的lca,以及当要修改单边的时候,把边的编号*2(因为是双向边),然后挑深度大的那个点来修改重点是区间覆盖tag和区间加tag。首先注意,进行区间覆盖时,一定要清零区间加tag。然后其次,pushdown的时候一定要先覆盖...原创 2018-10-28 16:08:00 · 121 阅读 · 0 评论 -
【BZOJ 3718】 [PA2014]Parking(树状数组)
容易想到如果两个“交叉”的车车的宽度加起来比停车场还宽了那肯定是不合法的也就是说 一个车子移动过程中只要前面存在一个位置,经过了他,而且和他的和大于w就是不合法的然后我们从大到小枚举终点位置 这样保证了树状数组里维护的一定是经过了当前点的#include<bits/stdc++.h>#define N 50005using namespace...原创 2018-10-29 17:07:00 · 148 阅读 · 0 评论 -
【NOI2018】归程(kruskal重构树+最短路+树上倍增)
总的来说 从v通往1的道路 分为了步行和开车也就是说 一个点u 他能作为分界点 当且仅当存在一条路径(u,v)的海拔全部高于当天水位线 且(u,1)是最短路很显然 这是一个与瓶颈有关的问题 不难想到Kruskal重构树由于瓶颈是海拔 所以我们先建出以海拔为关键字的重构树由于是个小根堆 所以一个节点 子树的海拔都大于他 换句话说 v能到达子树里的任意一点所...原创 2018-10-31 15:00:00 · 182 阅读 · 0 评论 -
【CF869E】The Untended Antiquity(哈希+二维树状数组)
当覆盖两点的最小矩形不同时,一定不可达这样的问题不难想到经典的二维树状数组+差分来支持二维区间覆盖+查询对于覆盖操作 我们可以差分的给这个矩阵里加上一个编号对于操墙操作 我们可以反着减去这个编号对于查询 就查询这两个点的值是否相同 编号的累积不影响 因为只有在同一个墙内才会累积注意 如果只是单单的把编号从1开始标号是不够的 因为会出现1+3=2+2这类情...原创 2018-10-31 17:33:00 · 211 阅读 · 0 评论 -
【NOIP 校内模拟】T3 忘了是啥名字了(dfs序+树状数组)
对于当前新加入的一条路径 他产生的贡献分为两种1.另一条路径的LCA在当前路径上2.当前路径的LCA在另一条上对于情况1:可以维护当前点到根节点有多少个LCA,查询只需查询u,v,-2*lca(u,v),修改需要对lca的子树+1对于情况2:显然的树上差分,查询就是lca子树的前缀和,修改u++,v++,lca-2即开两个树状数组,一个支持单点查询+区间修改,一个支持单点修...原创 2018-11-05 20:30:00 · 140 阅读 · 0 评论 -
【USACO15DEC】最大流Max Flow(树上差分)
听了教练的考前须知 蒟蒻紧张的要死 只想做信心题#include<bits/stdc++.h>#define N 50005using namespace std;int n,k,tot,first[N]; struct Tree{ int to,next;}edge[2*N];inline void addedge(int x...原创 2018-11-06 10:30:00 · 150 阅读 · 0 评论 -
【洛谷 P3398】仓鼠找sugar(lca)
听了教练的考前须知 蒟蒻紧张的要死 只想做信心题同时满足:c或者d在x子树里 a或者b在y子树里 其中x=lca(a,b),y=lca(c,d)#include<bits/stdc++.h>#define N 100005using namespace std;template<class T>inline void read(T &x){...原创 2018-11-06 14:45:00 · 129 阅读 · 0 评论