Mass Change Queries CodeForces - 911G (线段树合并)
大意: 给定序列, 每次操作将区间[l,r]中的x全改为y, 最后输出序列
权值范围比较小, 对每个权值开一颗线段树, 每次将x合并到y上即可
#include <iostream>
#include <algorithm>
#include <cstdio>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define mid (l+r>>1)
#define lc (o<<1)
#define rc (lc|1) using namespace std;
typedef long long ll; const int N = 2e5+10;
int a[N], n, m, t;
int rt[110], tot, ql, qr, now;
struct _ {int l,r;}v[N<<5]; void ins(int &o, int l, int r, int pos) {
if (!o) o=++tot;
if (l==r) return;
if (mid>=pos) ins(v[o].l,l,mid,pos);
else ins(v[o].r,mid+1,r,pos);
} int merge(int x, int y) {
if (!x||!y) return x^y;
v[x].l = merge(v[x].l,v[y].l);
v[x].r = merge(v[x].r,v[y].r);
return x;
} void update(int &x, int &y, int l, int r) {
if (!x) return;
if (ql<=l&&r<=qr) return y=merge(x,y),void(x=0);
if (!y) y=++tot;
if (mid>=ql) update(v[x].l,v[y].l,l,mid);
if (mid<qr) update(v[x].r,v[y].r,mid+1,r);
} void dfs(int o, int l, int r) {
if (!o) return;
if (l==r) return void(a[l]=now);
dfs(v[o].l,l,mid),dfs(v[o].r,mid+1,r);
} int main() {
scanf("%d", &n);
REP(i,1,n) {
int t;
scanf("%d", &t);
ins(rt[t],1,n,i);
}
scanf("%d", &m);
while (m--) {
int x, y;
scanf("%d%d%d%d", &ql, &qr, &x, &y);
if (x!=y) update(rt[x],rt[y],1,n);
}
REP(i,1,100) now=i,dfs(rt[i],1,n);
REP(i,1,n) printf("%d ",a[i]);
puts("");
}
Mass Change Queries CodeForces - 911G (线段树合并)的更多相关文章
- Mass Change Queries Codeforces - 911G
https://codeforces.com/contest/911/problem/G 没想到线段树合并还能这么搞.. 对每个权值建一个线段树(动态开点),如果权值为k的线段树上第i位为1,那么表示 ...
- Alyona and a tree CodeForces - 739B (线段树合并)
大意: 给定有根树, 每个点$x$有权值$a_x$, 对于每个点$x$, 求出$x$子树内所有点$y$, 需要满足$dist(x,y)<=a_y$. 刚开始想错了, 直接打线段树合并了..... ...
- Recursive Queries CodeForces - 1117G (线段树)
题面: 刚开始想复杂了, 还以为是个笛卡尔树.... 实际上我们发现, 对于询问(l,r)每个点的贡献是$min(r,R[i])-max(l,L[i])+1$ 数据范围比较大在线树套树的话明显过不了, ...
- codeforces 893F - Physical Education Lessons 动态开点线段树合并
https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...
- Codeforces 671D Roads in Yusland [树形DP,线段树合并]
洛谷 Codeforces 这是一个非正解,被正解暴踩,但它还是过了. 思路 首先很容易想到DP. 设\(dp_{x,i}\)表示\(x\)子树全部被覆盖,而且向上恰好延伸到\(dep=i\)的位置, ...
- Codeforces 666E Forensic Examination SAM or SA+线段树合并
E. Forensic Examination http://codeforces.com/problemset/problem/666/E 题目大意:给模式串S以及m个特殊串,q个询问,询问S的子串 ...
- [Codeforces 266E]More Queries to Array...(线段树+二项式定理)
[Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...
- codeforces 600E E. Lomsat gelral (线段树合并)
codeforces 600E E. Lomsat gelral 传送门:https://codeforces.com/contest/600/problem/E 题意: 给你一颗n个节点的树,树上的 ...
- 【Codeforces 1037H】Security(SAM & 线段树合并)
Description 给出一个字符串 \(S\). 给出 \(Q\) 个操作,给出 \(L, R, T\),求字典序最小的 \(S_1\),使得 \(S^\prime\) 为\(S[L..R]\) ...
随机推荐
- python webdriver 从无到有搭建数据驱动自动化测试框架的步骤和总结
一步一步搭建数据驱动测试框架的过程和总结 跟吴老学了搭建自动化数据驱动的框架后,我在自己练习的时候,尝试从简单的程序进行一点一点的扩展和优化,到实现这个数据驱动的框架. 先说一下搭建自动化测试框架的目 ...
- python socket编程函数介绍
网上看到一个socket中常用函数的介绍,记录一下 https://blog.csdn.net/rebelqsp/article/details/22109925
- Linux基础命令---yes
yes 反复的输出指定的字符串,直到手动停止.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 yes [STR ...
- Python之路----各类推导式
[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能 列表推导 ...
- TimeUnit简析
TimeUnit是java.util.concurrent包下面的一个类,主要有两种功能: 1.提供可读性更好的线程暂停操作,通常用来替换Thread.sleep() 2.提供便捷方法用于把时间转换成 ...
- Python3基础 json.loads 解析json格式的数据,得到一个字典
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 区间内x的出现个数(主席树)
题目大概:求区间内x出现的次数 出题人yjy Description ZJK 给你一个长度为 n 的数列和 m 次询问,每次询问从第 l 个到第 r 个数中,数 x 出现了多少次.Input第一行一个 ...
- Autoafc 手动获取接口实例
demo: using Autofac; using Autofac.Integration.Mvc; using Rongzi.RZR.Huoke.Repository; using Rongzi. ...
- TeeChart取消3D
tChart1.Aspect.View3D = false;//此属性默认是true 3d的效果 2d平面的效果 题外话,在使用控件的时候,需要注意: 在TChart控件上增加Series, se ...
- 【文件readonly异常】异常退出编译文件,再次进入提示readonly
1.对于同一个文件如果上次已经打开,而未关闭的情况下,又打开该文件进行编辑时,会出现如下提醒: 这是由于已经打开但未闭关的文件,会在其目录下出现一个.swp的文件,由于是属于隐藏文件,可以用命令l. ...