
数据结构
赤兔码
我服了
展开
-
Codeforces Round #673 (Div. 1) D.Graph and Queries
D.Graph and Queries题意:一开始n个点m条边的无向图,这个无向图不一定是联通的,每个点都有一个点权然后有q个操作,操作1给出一个x,然后询问x的所在的连通图中权值最大的点的权值,然后将这个点的点权改为0,操作2给出一个x,将第x条边断开。思路:可以离线,所以可以倒着合并每条断开的边,每次合并断开的边就有可能合并两个集合,因此可以用链表代表两个集合,合并时直接用splic函数o(1)合并,所以总结就是倒着来两遍,第一遍用链表合并,使得每次断开一条边得到的两个集合是相邻的,这样就可以进原创 2020-10-14 13:42:34 · 200 阅读 · 1 评论 -
HDU 6856 Breaking Down News 2020多校第8场1002
题意:嫖了一张题意图。思路:一开始以为是dp,发现dp个????,然后因为dp[i]的取值为max(dp[j]+{sum[i]-sum[j]}),所以应该是个线段树问题。当x=0时,{x}=0;当x<0时,{x}=-1;当x>0时,{x}=1;然后就是区间的x+{y}问题。一开始线段树各种没想法,后来突然想到权值线段树,然后就很明显正解,然后再中途还需要配个单调队列。因为y是由sum[i]-sum[j]决定的,所以可以在sum[j]放入dp[j],这样sum[i]减去(1,sum[i原创 2020-09-01 15:06:36 · 204 阅读 · 0 评论 -
2019 ICPC Asia Jakarta 问题 G: Performance Review
题意:有一个公司,有n个员工,然后每个员工都有一个能力值,每年会淘汰r[i]个员工,然后再新招聘r[i]个新员工,同样有能力值,这样就使得公司一直有n个人。然后q个更改,如果把第i年招聘的第j个员工的能力值改为z,那么m年后一号员工还能在公司里吗。修改是永久性修改,一开始看错题了,md白写了。思路:首先如果假设第一个员工,也就是我,比我大的人为x个,那么我的rank排名就是x+1,那么只要我还在公司里,那么比我大的人一定在公司里,如果说某一年淘汰r个人,那么我就得是前n-r名才行,这样即为只有我的rk满足原创 2020-09-01 11:20:40 · 225 阅读 · 0 评论 -
牛客练习赛66 E-骚区间
骚区间题意:给一个长度为n的全排列,求有多少个骚区间。骚区间定义,对于[l,r]这个区间满足在这个区间中只有1个数小于al,只有1个数大于ar,那么这个区间就为骚区间。n<=1000000,ai数组为全排列。思路:明显枚举每个端点作为骚区间的左端点,假设我们枚举ai作为左端点,然后在他右边找到第一个小于ai的数的位置x,然后再在x的右边找第一个小于ai的数的位置y,明显以ai为左端点的骚区间只能在[x,y)这个区间中选择右端点,同理也可以枚举每个数作为右端点,然后找他左边第一个第二个大于ai的数x原创 2020-06-28 18:38:16 · 349 阅读 · 0 评论 -
Jiu Yuan Wants to Eat 树链剖分和线段树多重标记
Jiu Yuan Wants to Eat题意:unsigned long long 型的数,四种操作:操作1树上区间乘以某个数,操作2树上区间加上某个数,操作3树上区间反转,即二进制1变成0,0变成1,操作四求和,由于是unsigned long long,所以变量自动取模。注意点:线段树多重标记,主要是乘法的lazy标记最好为1,因为在别的题可能为0为1无所谓只要处理好就行,但是这个题只能...原创 2020-01-20 00:37:00 · 288 阅读 · 0 评论 -
如果解决区间不重复的数的个数----只维护某个数最后一次出现的位置!!!---E. Messenger Simulator
E. Messenger Simulator题意:一开始有一个1到n的数组,然后m个操作,操作输入ai,将ai移动到数组的第一个位置,求在m个操作的过程中每个数的最小位置和最大位置。思路:首先maxl[i],maxr[i]代表每个数的最小和最大位置,进行初始化,然后遍历一遍操作a数组,然后当第一次碰到一个数时,这个数的maxl即为1,然后maxr即为之前出现过的数中小于这个数的个数+这个数初始...原创 2020-01-15 22:22:45 · 281 阅读 · 0 评论 -
有向无环图的支配树
支配树:树上的任何一个点的所有祖先都是在有向无环图中这个点到树根的所有路径的必经点。有向无环图支配树求法:由于在有向无环图中可能有很多联通块,所有需要先记录入度,然后从每个入度为0的点开始跑bfs,每个点在支配树上的父亲就是在有向无环图中它的所有父亲的LCA。有向无环图的支配树模板题#include<iostream>#include<cstdio>#inclu...原创 2019-11-16 17:15:14 · 356 阅读 · 0 评论 -
Tree ---树链剖分之31个线段树
Tree一开始开了31个线段树sum维护区间异或和,然后第五个点T了,之后又sum维护区间1的个数,然后第12个点T了,然后又把两个循环合成了一个,然后提前算出来了一个数就A了,感觉时间卡的很离谱。 卡时间垃圾题。基本都是板子。#include<iostream>#include<cstdio>using namespace std;const int MAX_N...原创 2019-11-16 00:27:46 · 190 阅读 · 0 评论 -
树链剖分模板
基于边#include<iostream>#include<cstdio>using namespace std;const int MAX_N=50100;int size[MAX_N],wson[MAX_N],dfn[MAX_N],deep[MAX_N],pre[MAX_N],top[MAX_N],fa[MAX_N];int head[MAX_N],Next...原创 2019-11-15 16:19:23 · 161 阅读 · 0 评论 -
LCA模板
用vector写的会T,o2优化才过的改成邻接表应该就不会T了P3379 【模板】最近公共祖先(LCA)#include<iostream>#include<cstdio>#include<vector>using namespace std;vector<int>edge[501000];int dp[501000][20],hav...原创 2019-09-26 21:49:24 · 283 阅读 · 0 评论 -
HDU - 4757 Tree
HDU - 4757 Tree题意:在树上每个节点都有一个权值,每次询问给出x,y和一个值z,求在树上点x到点y的路径上每个点的权值异或z之后的最大值。思路:可持久化01字典树,利用LCA,即两段路径,x到LCA(a,b)和y到LCA(a,b),可以按dfs序来可持久化,比如root[i]可以接他的父亲即root[fa[i]]。挺有用的想法,应该可以扩展到树上主席树。#include&l...原创 2019-11-04 22:51:29 · 197 阅读 · 0 评论 -
CodeForces - 979D Kuro and GCD and XOR and SUM
CodeForces - 979D Kuro and GCD and XOR and SUM题意:两个操作,1向数组中添加一个值x,2询问数组中的值满足所给条件的异或xi之后为最大值的值。2操作输入xi,ki,si,在数组中找到一个值v满足ki|gcd(xi,v),并且xi+v<=si,在所有满足的v中选一个异或xi之后的最大值。思路:异或最大,01字典树,而且还不用持久化,因为ki需...原创 2019-11-04 22:39:51 · 210 阅读 · 0 评论 -
可持久化Trie树
模板const int MAX_N=301000;int trie[MAX_N*32][2],latest[MAX_N*32];int s[MAX_N],root[MAX_N],tot;void insert(int k,int k1,int val,int i,int deep){ if(deep<0){ latest[k1]=i; return; } int x=(...原创 2019-11-03 12:40:58 · 270 阅读 · 0 评论 -
李超树
#include<iostream>#include<cstdio>using namespace std;const int MAX_N=10010;struct line{ double k,b;}a[MAX_N];int tr[MAX_X];double f(int id,int x){ return a[id].k*(x-1)+a[id].b;}...原创 2019-10-14 19:01:26 · 330 阅读 · 0 评论 -
线段树模板
单点更新区间查询struct node{ int l,r,max;}a[MAX_N*4];int b[MAX_N];void update(int k){ a[k].max=max(a[k<<1].max,a[k<<1|1].max);}void build(int k,int l,int r){ a[k].l=l;a[k].r=r; if(l==r){...原创 2019-08-05 14:43:23 · 352 阅读 · 0 评论 -
主席树模板
int num=0;struct skt{ int l,r,sum;}f[MAX_N*40];int root[MAX_N],b[MAX_N];void build(int k,int l,int r){ if(l==r){ f[k].sum=0; if(k>num) num=k; return; } else{ int mid=(l+r)>&...原创 2019-08-27 00:06:23 · 192 阅读 · 0 评论 -
动态主席树
一般需要离散化无离散化模板const int MAX_N=100100;int n,m,num=0,len;int a[MAX_N];int root[MAX_N],root1[MAX_N],lc[MAX_N],rc[MAX_N],lcnt,rcnt,nn;struct skt{ int l,r,sum;}f[MAX_N*400];void locate(int l,int r)...原创 2019-09-24 19:06:39 · 297 阅读 · 0 评论 -
P3157 [CQOI2011]动态逆序对
P3157 [CQOI2011]动态逆序对题解:首先统计出未删除之前的数组的逆序对数,然后建立动态主席树,删点,然后主席树查找删除的这个位置之前的所有数比删除的这个数大的数,再找这个位置之后比删除数小的数,减去即可,每次删除前输出ans。这个题都是模板,难点在于修改查询函数,查询不再是区间第k大,而是区间大于某个数的个数(即ask2函数)或者小于某个数的个数(即ask1函数)。#include...原创 2019-09-25 11:24:27 · 210 阅读 · 0 评论 -
问题 E: 小A盗墓
问题 E: 小A盗墓一开始想动态主席树,但是太麻烦了,所以就线段树。询问时区间查询sum和以及xor异或和,然后利用规律通过sum和找这段区间应该开始的be和应该结束的en,然后利用函数xor_n求be到en的前缀异或和,然后将其与线段树查询的异或和相比较即可。学到了一个小知识点,求1到n的异或和。long long xor_n(long long n){ long long t=...原创 2019-09-25 19:47:26 · 188 阅读 · 0 评论 -
dfs序模板
列如这个图seq数组为 1 2 5 3 4 6 7in数组为1 2 4 5 3 6 7out数组为7 3 4 3 7 6 7如果改一个点x的子树上的值,即区间更改seq数组中【in[x],out[x]】的值。一般可以存一个pos数组,pos[i]代表i这个数在seq数组的位置,即如果说更改3这个节点的权值,即在线段树中更改pos[3]即4的权值即可,如果更改3的整个子树,那么就是更改区...原创 2019-09-26 22:44:09 · 311 阅读 · 0 评论 -
树链剖分模板
学习笔记const int MAX_N=100100;vector<int>v[MAX_N];struct node{ int sum,lazy,l,r,ls,rs;}node[2*MAX_N];int root,n,m,r,a[MAX_N],cnt,head[MAX_N],fa[MAX_N],deep[MAX_N],size[MAX_N],son[MAX_N],seq[M...原创 2019-09-27 14:34:25 · 186 阅读 · 0 评论 -
平衡二叉树之Treap树&Splay树
Treap树就是平衡二叉树,每个点都有两个值,分别是优先级和键值,Treap树满足父节点的优先级大于两个子节点(如果有的话),而且满足父节点的左子节点的键值小于父节点,右子节点键值大于父节点,所以如果每个节点的优先级已经确定好了的话的话,那么这个Treap树的形态也是确定好的,而优先级这东西是靠随机函数赋值的,所以最坏情况下可能会导致Treap树成为一条链,但是在数学期望下Treap基本是平衡的,...原创 2019-10-08 22:32:00 · 679 阅读 · 0 评论 -
RMQ算法求区间极值--倍增思想
int dp[MAX_N][log2(MAX_N)],a[MAX_N];//dp[i][j]代表从i开始长度为2的j次方的区间的最小值 void rmq_init(){ for(int i=1;i<=N;i++) dp[i][0]=a[i]; for(int j=1;(1<<j)<=N;j++){ for(int i=1;i+(1...原创 2019-08-03 15:49:15 · 153 阅读 · 0 评论