题意:
给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列.
题解:
100个数,很容易想到要从这里进行突破,对于某次操作我们只需要把这个区间的数x给移动到y的这个数的集合里面不就可以了。线段树合并!
这样的话我们对于每一种颜色动态开一个线段树,合并就把颜色为x的线段树区间l r合并到颜色为y的线段树的区间l r 上即可。
之前大多数的线段树合并是整颗线段树进行合并,这个是针对于某段区间进行合并,我们需要稍微调整一下这个update即可。
最后只需要遍历一遍这100棵线段树然后把有值的位置存到ans数组里面最后输出即可。
代码:

//#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
//#define int long long
const int maxn=2e7+10;
#define endl '\n'int rt[110];
int ls[maxn],rs[maxn];
int cnt;
//bool tree[maxn];void ins(int &node,int start,int ends,int pos){if(!node) node=++cnt;if(start==ends){//tree[node]=true;return ;}int mid=(start+ends)/2;if(pos<=mid) ins(ls[node],start,mid,pos);else ins(rs[node],mid+1,ends,pos);//push(node);
}int mer(int x,int y){if(!x||!y) return x+y;ls[x]=mer(ls[x],ls[y]);rs[x]=mer(rs[x],rs[y]);return x;
}void update(int &x,int &y,int start,int ends,int l,int r){  //y合并到xif(!y) return ;if(l<=start&&ends<=r){x=mer(x,y);y=0;return ;}if(!x) x=++cnt;   //x如果没有需要开辟新的结点int mid=(start+ends)/2;if(l<=mid) update(ls[x],ls[y],start,mid,l,r);if(mid<r) update(rs[x],rs[y],mid+1,ends,l,r);}
int ans[200010];
void query(int node,int start,int ends,int val){if(node==0) return ;if(start==ends){ans[start]=val;return ;}int mid=(start+ends)/2;query(ls[node],start,mid,val);query(rs[node],mid+1,ends,val);
}signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;cin>>n;for(int i=1;i<=n;i++){int x;cin>>x;ins(rt[x],1,200000,i);}int q;cin>>q;while(q--){int l,r,x,y;cin>>l>>r>>x>>y;if(x==y) continue;update(rt[y],rt[x],1,200000,l,r);}for(int i=1;i<=100;i++){query(rt[i],1,200000,i);}for(int i=1;i<=n;i++) cout<<ans[i]<<" ";}

CF911G Mass Change Queries (线段树区间 合并)相关推荐

  1. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

  2. CodeForces - 1539F Strange Array(线段树区间合并)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,规定位置 iii 的贡献是:设 x=a[i]x=a[i]x=a[i],选择一个包含 iii 的区间 [l,r][l,r][l,r],将其中 ...

  3. 2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并

    传送门 文章目录 题意: 思路: 题意: 题面挺绕口的,还是看原题比较好. 大概的意思就是让你从给定的区间中选择一个以左端点为起点的一个上升子序列,让后将这些下标存下来,在bbb中将这些位置拿出来后, ...

  4. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

  5. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  6. 牛客 - 求函数(线段树+区间合并/线段树+矩阵维护)

    题目链接:点击查看 题目大意:现在有 n 个函数,每个函数都是诸如 f( x ) = k * x + b 的形式,只是每个函数的 k 和 b 都是相互独立的,现在给出两个操作: 1 pos k b:将 ...

  7. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

  8. HDU3308 线段树区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...

  9. HDU1540(线段树区间合并)

    很经典的一道题,线段树区间合并非常好的一道入门题,每个节点保存区间连续1的最大左串长度,最大右串长度,以及区间最大长度(常规的三种信息维护),更新操作时注意push_up函数,针对不同的问题,push ...

最新文章

  1. Codeforces Beta Round #95 (Div. 2) 部分解题报告 (dp,组合数,)
  2. vs2005 Key not valid for use in specified state
  3. javascript基本数据类型问题汇总
  4. 交通注意:叉车和自行车
  5. 分享几个Java面试小技巧,建议收藏!
  6. 新手制作bom表格教程_抖音短视频怎么制作?这里有全部最新教程+指导,新手0基础上手!...
  7. python常见的异常类有哪些_Python常见异常类型
  8. js禁止粘贴非数字内容
  9. 11 MM配置-主数据-定义物料类型的编码范围
  10. 全概公式和贝叶斯公式的理解及例题
  11. 通过调用外部exe的方法实现c#调用java
  12. node repl环境
  13. USACO 5.2.2 fence3
  14. [转载] 信息系统项目管理师教程——06 信息化基础知识
  15. 用automake建立共享库(动态链接库)Makefile
  16. 《深入浅出数据分析》读书心得与笔记
  17. 华为、阿里等大厂程序员真的好找对象吗?
  18. 基于jsp、ssm网上购物商城系统(带论文)
  19. python实现决策树 西瓜书_西瓜书学习笔记-决策树
  20. 【django】class='btn' btn按钮样式

热门文章

  1. 列表标签ul、ol、dl、li
  2. 基于交换技术的网络中,全双工主要运行在?( 内有答案与详解)
  3. Self-Attention 加速方法一览:ISSA、CCNet、CGNL、Linformer
  4. OpenCV图像旋转的原理与技巧
  5. Spring事务配置探究
  6. 哈希一致性、哈希取余、自定义轮询分片的比较
  7. C# Aop简单扫盲及ORM实体类属性拦截示例
  8. winform 异步更新ui
  9. Iterator(迭代器)接口 --对象循环遍历
  10. UIImageView 与 UIButton的区别