随笔分类 -  数据结构

摘要:题目链接 题目大意:题目说得很清楚。 题解思路:由于T2生成随机&&修改随机,所以平均每次修改都在log级别!我们考虑对于 T1上的每个点下面再挂一个点,边权为在 T2中的深度。此时两点的距离即为两个节点新挂的节点的距离。由于边权非负,所以我们等价于维护新树上的直径。那么该如何动态维护直径呢? 可以 阅读全文
posted @ 2020-11-16 18:48 Mmasker 阅读(147) 评论(0) 推荐(0)
摘要:1.Codeforces Edu Round 2. E. Lomsat gelral 题意:给你一棵树,树上有n个节点,每个节点有自己的颜色,让你求每个节点子树出现次数最多的颜色之和。 题解思路:利用轻重链剖分的特性去枚举每个节点,再用数组记录一下当前节点子树上每种颜色出现的次数,最后计算答案即可。 阅读全文
posted @ 2020-11-10 15:42 Mmasker 阅读(117) 评论(0) 推荐(0)
摘要:ll p,a[MAXN],atag[MAXN],mtag[MAXN],ctag[MAXN],tree[MAXN]; void Pushup(int rt){tree[rt]=(tree[rt<<1]+tree[rt<<1|1])%p;} void Pushdown(int rt,int ln,int 阅读全文
posted @ 2020-05-17 15:38 Mmasker 阅读(199) 评论(0) 推荐(0)
摘要:题目链接 题解思路:题目给了一棵n个节点的数和q次询问,每次询问是询问[L,R]区间内有多少个连通块。由于是一棵树,连通块的数量=节点数-边数,在明白这点以后就可以开始思考了,节点数很简单,就等于R-L+1,那么最重要的就是求边数。由于q有2e5次询问,因此每次算边数必须在log一下的时间内计算。这 阅读全文
posted @ 2020-05-15 14:18 Mmasker 阅读(201) 评论(0) 推荐(0)
摘要:题目链接: 题解思路:首先按数组中的下标建一棵线段树,假设原数组是a,我们用一个新数组b记录a,将b数组先按权值排序、再按下标排序,然后再用数组记录m次询问,按k从小到大排序,再对每个询问二分线段树右边界,最后把m次询问按原来的顺序排回来,最后按顺序输出答案即可。 #include<bits/std 阅读全文
posted @ 2019-11-25 14:18 Mmasker 阅读(261) 评论(0) 推荐(0)
摘要:#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> PII; const int MAXN = 1e6+10; const double EPS = 1e-12; int n 阅读全文
posted @ 2019-11-12 14:28 Mmasker 阅读(139) 评论(0) 推荐(0)
摘要:#include<bits/stdc++.h> using namespace std; #define maxn 100005 #define ll long long #define ls l,mid,rt<<1 #define rs mid+1,r,rt<<1|1 typedef pair<i 阅读全文
posted @ 2019-08-19 17:04 Mmasker 阅读(121) 评论(0) 推荐(0)
摘要:题目链接 题解思路:对于每个位置,求出需要减掉的数 然后在权值线段树上进行二分找答案。 #include<bits/stdc++.h> using namespace std; #define maxn 200005 #define ll long long #define ls l,mid,rt< 阅读全文
posted @ 2019-08-15 18:00 Mmasker 阅读(158) 评论(0) 推荐(0)
摘要:找左右第一个小于自己的值: int top=0; for(int j = m ; j >= 1 ; -- j){ while(top!=0&&s[i][j]<s[i][st[top]]) l[st[top]]=j,top--; st[++top]=j; } top=0; for(int j = 1 阅读全文
posted @ 2019-07-23 15:14 Mmasker 阅读(110) 评论(0) 推荐(0)