Mass Change Queries Codeforces - 911G
https://codeforces.com/contest/911/problem/G
没想到线段树合并还能这么搞。。
对每个权值建一个线段树(动态开点),如果权值为k的线段树上第i位为1,那么表示a[i]=k;如果权值为k的线段树上第i位为0,表示a[i]≠k
改变权值的时候,就是把[l,r]分解成多个线段树上的区间;对于每个分解出的区间,分别在权值为x的线段树上和权值为y的线段树上找到对应的节点,设某个区间找到的节点为a,b,则把b子树合并到a上
注意!要特判x==y时跳过操作
最后枚举一遍所有权值得到答案
复杂度n*100+n*log
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
namespace S
{
#define N 4000000
int d[N],lc[N],rc[N];
queue<int> q;
void init()
{
for(int i=;i<N;i++) q.push(i);
}
int getnode()
{
int t=q.front();q.pop();
lc[t]=rc[t]=d[t]=;
return t;
}
void delnode(int x){q.push(x);}
void addx(int L,int x,int l,int r,int &num)
{
if(!num) num=getnode();
if(l==r) {d[num]+=x;return;}
int mid=l+((r-l)>>);
if(L<=mid) addx(L,x,l,mid,lc[num]);
else addx(L,x,mid+,r,rc[num]);
}
int merge(int x,int y)
{
if(!x||!y) return x+y;
lc[x]=merge(lc[x],lc[y]);
rc[x]=merge(rc[x],rc[y]);
d[x]+=d[y];
delnode(y);
return x;
}
void work(int L,int R,int l,int r,int &n1,int &n2)
{
if(!n1) n1=getnode();
if(L<=l&&r<=R) {n1=merge(n1,n2);n2=;return;}
int mid=l+((r-l)>>);
if(L<=mid) work(L,R,l,mid,lc[n1],lc[n2]);
if(mid<R) work(L,R,mid+,r,rc[n1],rc[n2]);
}
int ans[];
void dfs(int l,int r,int k,int num)
{
if(l==r)
{
if(d[num]) ans[l]=k;
return;
}
int mid=l+((r-l)>>);
dfs(l,mid,k,lc[num]);dfs(mid+,r,k,rc[num]);
}
}
int rt[];
int n;
int main()
{
int t,i,l,r,x,y,q;
S::init();
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%d",&t);
S::addx(i,,,n,rt[t]);
}
scanf("%d",&q);
while(q--)
{
scanf("%d%d%d%d",&l,&r,&x,&y);
if(x==y) continue;
S::work(l,r,,n,rt[y],rt[x]);
}
for(i=;i<=;i++) S::dfs(,n,i,rt[i]);
for(i=;i<=n;i++) printf("%d ",S::ans[i]);
return ;
}
(分块也能做,不过我自己写的常数太糟...开了Ofast交了几十发后也只A了一次。。。)
Mass Change Queries Codeforces - 911G的更多相关文章
- Mass Change Queries CodeForces - 911G (线段树合并)
链接 大意: 给定序列, 每次操作将区间[l,r]中的x全改为y, 最后输出序列 权值范围比较小, 对每个权值开一颗线段树, 每次将x合并到y上即可 #include <iostream> ...
- codefroces 911G Mass Change Queries
题意翻译 给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列. 输入输出格式 输入格式: The first line contains one intege ...
- [CF911G]Mass Change Queries
题目大意: 给你一个长度为n的数列a,按顺序进行以下m次操作,每次将区间[l,r]中的所有x变成y,问最后数列是怎样的. 思路: 线段树. 每个线段树结点上维护当前区间每个数分别会变成多少.时间复杂度 ...
- CF911G Mass Change Queries(线段树+暴力)
cf机子真的快. 其实这个题的维护的信息还是很巧妙的. 首先,观察到题目中涉及到,区间修改这个操作,然后最后只查询一次,我们不妨用线段树来维护这个过程. 但是貌似直接维护每个位置的值可能不太好维护. ...
- AC日记——Array Queries codeforces 797e
797E - Array Queries 思路: 分段处理: 当k小于根号n时记忆化搜索: 否则暴力: 来,上代码: #include <cmath> #include <cstdi ...
- Tree and Queries CodeForces - 375D 树上莫队
http://codeforces.com/problemset/problem/375/D 树莫队就是把树用dfs序变成线性的数组. (原数组要根据dfs的顺序来变化) 然后和莫队一样的区间询问. ...
- Array Queries CodeForces - 797E
题目链接 非常好的一道题目, 分析,如果用暴力的话,时间复杂度是O(q*n)稳稳的超时 如果用二维DP的话,需要O (n*n)的空间复杂度,会爆空间. 那么分析一下,如果k>sqrt(n)的话, ...
- Recursive Queries CodeForces - 1117G (线段树)
题面: 刚开始想复杂了, 还以为是个笛卡尔树.... 实际上我们发现, 对于询问(l,r)每个点的贡献是$min(r,R[i])-max(l,L[i])+1$ 数据范围比较大在线树套树的话明显过不了, ...
- Books Queries (codeforces 1066C)
模拟题 开一个容器进行模拟即可,注意容器设置初始大小不然容易re.设置两个指针l,r.把容器当作桶,每一个桶都有一个编号表示位置,左边进入那么就是编号为l,右边一样.然后l--或者r++,l=r=0的 ...
随机推荐
- spring+mybatis项目整合
前辈总结的很详细,贴出链接,参考学习 http://www.open-open.com/lib/view/open1392252233301.html
- UVA10689 Yet another Number Sequence —— 斐波那契、矩阵快速幂
题目链接:https://vjudge.net/problem/UVA-10689 题解: 代码如下: #include <iostream> #include <cstdio> ...
- nginx ,node 配置项目
nginx ,node 配置项目 1.安装好node,npm 2.安装cnpm,-g是全局的 sudo npm install -g cnpm --registry=https://registry. ...
- ES6 对Math对象的扩展
Math 对象的扩展 Math.trunc() Math.trunc(4.1) // 4 Math.trunc(4.9) // 4 Math.trunc(-4.1) // -4 Math.trunc( ...
- 通用方法解决UITextFiled输入的时候,键盘遮挡问题
我们在用键盘录入的时候,有可能会遮挡录入框,所以我们应调整UIView的位置,使其不被遮挡.我写了一个通用的方法可以解决这个问题:1. [代码][C/C++]代码 - (void) ...
- tflearn数据预处理
#I just added a function for custom data preprocessing, you can use it as: minmax_scaler = sklearn.p ...
- 【EOJ Monthly 2018.2 (Good bye 2017)】
23333333333333333 由于情人节要回家,所以就先只放代码了. 此题是与我胖虎过不去. [E. 出老千的 xjj] #include<cstdio> #include<c ...
- SQL Server中查询CPU占用高的SQL语句
SQL Server中查询CPU占用高的情况,会用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests 一.查看当前的数据库用户连接有多少 USE ...
- 用Merge存储引擎中间件实现MySQL分表
觉得一个用Merge存储引擎中间件来实现MySQL分表的方法不错. 可以看下这个博客写的很清楚--> http://www.cnblogs.com/xbq8080/p/6628034.html ...
- 【223】◀▶ IDL HDF 文件操作说明
参考:I/O - HDF Routines —— HDF 操作函数 01 HDF_SD_START 打开一个 SDS 模式的 HDF 文件. 02 HDF_SD_END 关闭一个 SDS 模式 ...