
数据结构
文章平均质量分 75
数据结构相关的一些题
Edward The Bunny
这个作者很懒,什么都没留下…
展开
-
势能线段树(均摊分析)
对于每个区间维护区间内的 最大值MaxMaxMax 和 最小值MinMinMin,对于整除操作,如果有Max−⌊Maxd⌋=Min−⌊Mind⌋Max-\lfloor\frac{Max}{d}\rfloor = Min − \lfloor\frac{Min}{d}\rfloorMax−⌊dMax⌋=Min−⌊dMin⌋,就转化为区间减。否则直接向下递归。考虑何时满足Max−⌊Maxd⌋=Min−⌊Mind⌋Max-\lfloor\frac{Max}{d}\rfloor = Min − \lfloor\原创 2022-03-23 15:43:00 · 1150 阅读 · 0 评论 -
[XSY3112] 接水果(树上包含路径,整体二分,扫描线)
给出一棵nnn个点的树。接下来给出PPP条树上路径ai→bia_i\to b_iai→bi,及其权值cic_ici。最后有QQQ个询问,每个询问给出一条树上路径ui→viu_i\to v_iui→vi,问在包含ui→viu_i\to v_iui→vi的所有树上路径中(包含指ui→viu_i\to v_iui→vi是ai→bia_i\to b_iai→bi的子路径),权值第kkk小的路径权值是多少?不妨设dep[u]<dep[v]dep[u]<dep[v]dep[u]<原创 2021-11-19 12:05:52 · 146 阅读 · 0 评论 -
[XSY4170] 妹子(线段树上二分)
传送门题意:给出两个长度为NNN的整数序列A1A2...ANA_1A_2...A_NA1A2...AN,B1B2...BNB_1B_2...B_NB1B2...BN。有MMM组询问(opt,l,r,d)(opt,l,r,d)(opt,l,r,d),令n=r−l+1n=r-l+1n=r−l+1若opt=Aopt=Aopt=A:∀i∈[1,n],ai=Al+i−1+d,bi=Bl+i−1\forall i\in[1,n],a_i=A_{l+i-1}+d,b_i=B_{l+i-1}∀i∈[1,n原创 2021-11-18 17:28:33 · 160 阅读 · 0 评论 -
[XSY] 选举(线段树优化dp)
选举//a[i]=1 or 0 or -1,表示i支持小奇 or 中立 or 支持魔法猪//sum[i]=a[1]+a[2]+...+a[i] //设dp[i]表示把1~i划分成若干区间,(小奇得票-魔法猪得票)的最大值 /*dp[i]=max { dp[j]+1 (sum[i]-sum[j]>0即sum[i]>sum[j]) dp[j] (sum[i]-sum[j]=0即sum[i]=sum[j]) dp[j]-1 (sum[i]-sum[j]<0即sum原创 2021-11-18 15:15:03 · 186 阅读 · 0 评论 -
[POI2015] Pustynia(差分约数,线段树优化建图,拓扑)
传送门Description给定一个长度为n的正整数序列aaa,每个数都在111到10910^9109范围内,告诉你其中sss个数,并给出mmm条信息,每条信息包含三个数l,r,kl,r,kl,r,k以及接下来kkk个正整数x1,x2,...,xkx_1,x_2,...,x_kx1,x2,...,xk,表示a[l],a[l+1],...,a[r−1],a[r]a[l],a[l+1],...,a[r-1],a[r]a[l],a[l+1],...,a[r−1],a[r]里 a[x1],a[x2],..原创 2021-10-19 16:05:39 · 184 阅读 · 0 评论 -
[集训队作业2018] 三角形(贪心,堆,线段树合并)
传送门首先,在结点uuu放上w[u]w[u]w[u]个石子后,出于贪心考虑,下一步一定会把uuu的所有儿子vvv上的石子收回手中。转换题意:即cntcntcnt为当下树上的石子数,对每个结点uuu可以执行一次操作:step1. cnt+=w[u]cnt+=w[u]cnt+=w[u]step2. cnt−=∑v∈son(u)w[v]cnt-=\sum_{v\in son(u)}w[v]cnt−=∑v∈son(u)w[v]当且仅当对uuu的所有儿子vvv都执行过操作,才能对uuu执行操作。问原创 2021-10-12 22:04:57 · 361 阅读 · 1 评论 -
[集训队作业2018] 万圣节的积木(李超线段树)
设最底层为第1层,倒数第二层为第2层,以此类推。发现若第111 ~ iii层构成的积木稳定,第111 ~ jjj (j>ij>ij>i)构成的积木也稳定,那么第i+1i+1i+1 ~ jjj层构成的积木一定也是稳定的。所以我们只要找到所有的iii满足第111 ~ iii层构成的积木稳定,答案就是相邻的iii之间的差的最大值。然后一坨木板的加权重心是∑iximi∑imi\frac{\sum_{i}x_im_i}{\sum_{i}m_i}∑imi∑iximi,也就是j+1…原创 2021-10-12 21:04:09 · 209 阅读 · 0 评论 -
[NOIP2016 提高组] 天天爱跑步(树上差分)
如果没有时间的限制,这题就是对每个点iii,求经过iii的路径数,用树上差分解决即可:枚举路径x→y{x\to y\{x→y{a[x]+=1;a[y]+=1;a[x]+=1;a[y]+=1;a[x]+=1;a[y]+=1;a[lca(x,y)]−=1;a[fa[lca(x,y)]]−=2;a[lca(x,y)]-=1;a[fa[lca(x,y)]]-=2;a[lca(x,y)]−=1;a[fa[lca(x,y)]]−=2;}\}}枚举点i{i\{i{经过iii的路径数 = 以iii为根的子原创 2021-10-11 11:07:21 · 310 阅读 · 0 评论 -
[XSY3383]多线程(笛卡尔树,DP)
%%%tjytjytjy的笛卡尔树做法:设dp(l,r,Amin,Bmin)dp(l,r,Amin,Bmin)dp(l,r,Amin,Bmin)为把c[l],c[l+1],...,c[r]c[l],c[l+1],...,c[r]c[l],c[l+1],...,c[r]划到A,BA,BA,B两线程中,且划到AAA线程的数>Amin>Amin>Amin,划到BBB线程的数>Bmin>Bmin>Bmin的方案数。我们找到ppp,满足c[p]=max{c[l],c[l+1],原创 2021-10-02 17:51:59 · 180 阅读 · 0 评论 -
连续段问题小结
oi-wikiP4747P6795CF526Fblog原创 2021-10-03 11:01:32 · 325 阅读 · 0 评论 -
[XSY3382] 专家系统(二分+线段树)
XSY3382二分ccc,问题变成能否用一个长ccc宽ccc的矩形框住至少kkk个点。二维数点问题考虑用扫描线解决。将所有点按照xxx从小到大排序。枚举一段xxx坐标相差不超过ccc的点(双指针推进),初始想法是根据这些点的yyy值建一棵权值线段树,维护yyy值在某段区间内的点的个数,然后判断能否找到一段长度为ccc的区间,包含了至少kkk个点。但发现很难进行下去,所以换一个想法,定义aia_iai为yyy值在区间[i,i+c][i,i+c][i,i+c]内的点的个数,根据yyy值建权值线段树,维原创 2021-10-02 11:33:40 · 149 阅读 · 0 评论 -
[XSY] 智慧树(线性同余方程组,线段树/树状数组)
智慧树解决此题有两个要点:如何判断一个线性同余方程组有没有解如何统计合法子序列数目先看第2点:若一个序列是合法的,则这个序列的所有子序列都是合法的考虑对∀1≤i≤n\forall 1\leq i\leq n∀1≤i≤n,求出以iii为左端点时,序列右端点最右能取到哪,记为nxt[i]nxt[i]nxt[i]若不考虑l,rl,rl,r的限制,所有合法子序列数=∑i=1n(nxt[i]−i+1)\sum_{i=1}^{n}(nxt[i]-i+1)∑i=1n(nxt[i]−i+1)加入原创 2021-03-28 22:10:07 · 247 阅读 · 0 评论 -
简单的数据结构题(多项式、拉格朗日插值、线段树)
简单的数据结构题首先考虑计算要求的式子,不妨设l=1,r=nl=1,r=nl=1,r=n。∑i=1naik∏j≠i1−aiajai−aj\sum_{i=1}^{n}a_i^k\prod_{j\not=i}\frac{1-a_ia_j}{a_i-a_j}∑i=1naik∏j=iai−aj1−aiaj=∑i=1naik∏j≠i1ai−aj∏j≠i(1−aiaj)=\sum_{i=1}^{n}a_i^k\prod_{j\not=i}\frac{1}{a_i-a_j}\prod_{j原创 2021-03-19 17:06:29 · 216 阅读 · 0 评论 -
可持久化数据结构
Fhq-Treap:有什么用:解决序列操作问题用val排序:P3835#include<bits/stdc++.h>using namespace std;struct node{ int l,r;int size,rnd,v;}t[500005*50];int cnt,rt[500005];void up(int k){ t[k].size=t[t[k].l].size+t[t[k].r].size+1;}void newnode(int &k,原创 2021-03-08 21:22:08 · 146 阅读 · 0 评论 -
[XSY] 分割(dfs树)
题目相当于问 删掉两个点后 图是否仍然连通割点问题,考虑用dfs树解决设删去点u,v(dfn[v]<dfn[u])把 u, v 删去之后整棵树大概断成了几个部分:• v 上面到根的部分,以及上面挂着的那些东西,记作 highhighhigh;• u 到 v 之间的那一段,以及上面挂着的那些东西,记作 midmidmid;• u ,v的子树们,记作 lowulow_ulowu,lowvlow_vlowv。要保证删去u,v后图连通,则lowulow_ulowu,midmidmid,l原创 2021-03-03 22:23:13 · 261 阅读 · 1 评论 -
CF650E Clockwork Bomb(树上构造类问题、并查集)
Description给出两棵 n 结点的有标号树。每次操作删去第一棵树的一条边,再加上一条边,需要保证此时还是一棵树。构造一种操作序列,将第一棵树变成第二棵树,使得操作数最小。n ≤ 5×1055 \times 10^55×105Solution显然,对于第一颗树的边x↔yx \leftrightarrow yx↔y,如果这条边在第二颗树中也存在,那么是不可能更改这条边的。一个朴素的想法是直接遍历第一颗树,如果当前节点和其父亲连的边在第二颗树中没出现,那么更改为连向第二颗树中的父节点。但原创 2021-02-05 08:33:49 · 203 阅读 · 0 评论 -
CF526G Spiders Evil Plan(树上最优性问题、倍增+线段树)
Description一棵 n 个结点的树,有正边权。用 y 条链覆盖这棵树,满足:所有链连通(有重点即算作相连)点 x 被覆盖被覆盖的边的权值和尽可能大q 次给出 x, y,询问最大边权和,强制在线。n, q ≤ 10510^5105Solution可以发现一些比较显然的性质:权值是正的,那么链的端点一定可以全部调整成叶子。如果链不连通,可以交换链的端点使它们连通。使用 k 条路径就可以覆盖一棵有 2k 个叶子的树。(先以任意方式匹配叶子。如果有两条路径不相交,原创 2021-02-05 07:51:14 · 290 阅读 · 0 评论 -
CF1137F Matches Are Not a Child‘s Play(树上数据结构问题、树链剖分+ODT)
Description一棵 n 个点的树,点权最初为 1 ∼ n 的排列。定义一个删点过程:每次找到权值最小的叶子,删去它以及连接的边,重复这个过程直到剩下一个点,然后删去最后的点。处理 q 个询问:将一个点 x 的权值赋为当前最大权值 +1。查询在删点过程中,x 会是第几个被删除的。n, q ≤ 2×1052 \times 10^52×105Solution观察到删除序列的一些性质:权值最大的点最后一个被删。权值最大的点为 x,次大的为 y,那么序列最后一段就是 y 到 x转载 2021-02-04 20:24:15 · 175 阅读 · 0 评论 -
UOJ284 快乐游戏鸡(树上动态规划问题、长链剖分+单调栈)
参考文章:https://vfleaking.blog.uoj.ac/blog/2292https://www.cnblogs.com/penth/p/9801945.htmlhttps://blog.youkuaiyun.com/qq_42555009/article/details/100934540https://blog.youkuaiyun.com/zxyoi_dreamer/article/details/101705010https://blog.youkuaiyun.com/Mr_wuyongcong/article原创 2021-02-04 17:04:28 · 1051 阅读 · 1 评论 -
传送门(最短路树+可并堆)
Description有一张n个点m条边的无向图,求删去任意一条边后,从S到T的最短距离的最大值n, m ≤ 2×1052 \times 10^52×105Solution这道题是[USACO09JAN]Safe Travel的变形,然后这是题解Safe Travel这道题的普遍做法是并查集或树剖,但学长的PDF里提到的是题解讲的可并堆做法,所以我就没采用前两种然后讲回传送门这题,首先考虑怎么求删掉一条边后相邻两个点到 T 的最短距离。建出最短路树,如果删掉的不是连向父亲的边,则最短路不变,转载 2021-02-01 13:50:10 · 186 阅读 · 0 评论 -
[BZOJ 3173] [TJOI 2013] 最长上升子序列(splay)
根据题意很容易求得最原始的做法:#include<iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;const int N=100005;int n,m,f[N];int main(){ scanf("%d",&n); int x; for(int i=1;i<=n;i++){ scan原创 2020-07-24 15:21:34 · 157 阅读 · 0 评论