数据结构--线段树
fnq9999
这个作者很懒,什么都没留下…
展开
-
Hdu 3308 LCIS 线段树维护最长上升子序列
Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting from 0) Q A B: output the length of the longest consecutive increasing subsequence (LCIS) in [a, b]. #i...原创 2019-10-16 08:47:41 · 122 阅读 · 0 评论 -
Hdu 3308 LCIS 线段树维护最长上升子序列
Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting from 0) Q A B: output the length of the longest consecutive increasing subsequence (LCIS) in [a, b]. #i...原创 2019-10-16 08:45:53 · 203 阅读 · 0 评论 -
Codeforces 863E Turn Off The TV 差分 and 离散化
题意:给你N段线段,输出任意一个可以删掉的线段,删掉之后不改变原来的线段覆盖范围。 解: 1.将数据离散化保存,每个线段贡献3个数据,l,r,r+1 2、然后利用基于前缀和线段修改 3、线段树查询最值。 #include<bits/stdc++.h> #define ll long long using namespace std; const ll maxn =6e5+1...原创 2019-10-12 10:17:14 · 277 阅读 · 0 评论 -
洛谷 P3224 [HNOI2012]永无乡 线段树合并
题意:不断联通一个图,问每个联通块里排名第k的***原来编号*** #include<bits/stdc++.h> #define ll long long using namespace std; const ll maxn =1e5+10; const ll maxm=maxn *67; ll rd() {ll t;scanf("%lld",&t);return t;}...原创 2019-10-10 11:01:51 · 90 阅读 · 0 评论 -
Codeforces 600E 线段树合并
题意:问你最多每一个子树当中,出现次数最多的颜色的编号之和。 解:线段树合并 #include <bits/stdc++.h> #define en '\n' #define Swt signed main using namespace std; typedef long long ll; const ll inf=0x3f3f3f3f3f3f3f3f; const int...原创 2019-10-10 09:54:02 · 184 阅读 · 0 评论 -
Codeforces 817F MEX Queries 线段树
区间修改找最前面0的位置 两个标记: 区间置数很容易理解: 考虑区间翻转的话, 区间置数优先级>区间翻转 然后我们置数时,要将rec_tag清空 #include<bits/stdc++.h> #define en '\n' #define ll long long using namespace std; const ll inf=1e18+2; const...原创 2019-10-01 13:55:33 · 116 阅读 · 0 评论 -
Codeforces 817F MEX Queries 线段树 and 0/1区间修改
离散化+线段树 #include<bits/stdc++.h> #define en '\n' #define ll long long using namespace std; const ll inf=1e18+2; const ll maxn = 1e5+5; const ll maxm=maxn*36; ll rd() { ll x=0,f=1;char ch...原创 2019-10-01 13:53:03 · 144 阅读 · 0 评论 -
Codeforces 813 F. Bipartite Checking 时间分治线段树 and 带权并查集 (可撤销)
题意:不断删边加边,问此时的图可不可以为二分图。 解:判断二分图就看有没与奇数环 (没有就可以,有就不行) 时间分治线段树--->来看当前的图有没有奇环(带权并查集) 写一下并查集那里连边: merge发生在 x,y的祖先身上,我们是在间接连边,最后查询dis一定是正确的 c[i]表示 点i到 它的root的距离。 所以x,y连边之后merge里yy成为新的root:c[xx]表...原创 2019-09-30 13:23:30 · 206 阅读 · 0 评论 -
Codeforces 813 E. Army Creation 预处理 and 主席树
题意:给你一段序列,在线询问l,r 在l,r内选一个最大集合使得这个集合里任何相同的数字不超过k个。 解:询问区间怎样怎样(和次数有关)--->主席树 考虑每次询问下哪些元素被取,按照出现的顺序,一个type里靠前的会被选。这样的元素需要和不被选的有所区别, 想到一个比较经典的预处理,前面出现的位置(那么这里就预处理前面第k个出现的位置)那么每次查询就是查询这段区间里,前第k个元素位...原创 2019-09-29 15:50:40 · 161 阅读 · 0 评论 -
Codeforces 803G - Periodic RMQ Problem 动态开点线段树
题意:给你一个序列,这个序列出现了k次 比如 n=3,k=2的序列 {1,2,3}那么实际的序列就是 {1,2,3,1,2,3} 在这个重复k此的序列上进行区间修改并且查询最值: 解: 1、动态开点线段树 那么每次操作的复杂度就是 log(n*k) 总复杂度 q*log(n*k)可以接受 节点数计算q*2*log(len) (本来可以1A的 节点开少了 : 节点数==1e5*1og...原创 2019-09-27 14:54:03 · 236 阅读 · 2 评论 -
Codeforces 786B - Legacy 最短路 and 线段树
题意: 1.求S到所有点的最短路 2.三种加有向边的方式 (1)点->点(2)点到区间(3)区间到点 解: 1、暴力的话边加不完, 2、区间操作-->考虑线段树 3、建立两棵线段树 入树和出树 void build(ll &x,ll l,ll r,ll op){ x=++tot; if(l==r){ if(op=...原创 2019-09-20 11:11:08 · 152 阅读 · 0 评论