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的更多相关文章

  1. Mass Change Queries CodeForces - 911G (线段树合并)

    链接 大意: 给定序列, 每次操作将区间[l,r]中的x全改为y, 最后输出序列 权值范围比较小, 对每个权值开一颗线段树, 每次将x合并到y上即可 #include <iostream> ...

  2. codefroces 911G Mass Change Queries

    题意翻译 给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列. 输入输出格式 输入格式: The first line contains one intege ...

  3. [CF911G]Mass Change Queries

    题目大意: 给你一个长度为n的数列a,按顺序进行以下m次操作,每次将区间[l,r]中的所有x变成y,问最后数列是怎样的. 思路: 线段树. 每个线段树结点上维护当前区间每个数分别会变成多少.时间复杂度 ...

  4. CF911G Mass Change Queries(线段树+暴力)

    cf机子真的快. 其实这个题的维护的信息还是很巧妙的. 首先,观察到题目中涉及到,区间修改这个操作,然后最后只查询一次,我们不妨用线段树来维护这个过程. 但是貌似直接维护每个位置的值可能不太好维护. ...

  5. AC日记——Array Queries codeforces 797e

    797E - Array Queries 思路: 分段处理: 当k小于根号n时记忆化搜索: 否则暴力: 来,上代码: #include <cmath> #include <cstdi ...

  6. Tree and Queries CodeForces - 375D 树上莫队

    http://codeforces.com/problemset/problem/375/D 树莫队就是把树用dfs序变成线性的数组. (原数组要根据dfs的顺序来变化) 然后和莫队一样的区间询问. ...

  7. Array Queries CodeForces - 797E

    题目链接 非常好的一道题目, 分析,如果用暴力的话,时间复杂度是O(q*n)稳稳的超时 如果用二维DP的话,需要O (n*n)的空间复杂度,会爆空间. 那么分析一下,如果k>sqrt(n)的话, ...

  8. Recursive Queries CodeForces - 1117G (线段树)

    题面: 刚开始想复杂了, 还以为是个笛卡尔树.... 实际上我们发现, 对于询问(l,r)每个点的贡献是$min(r,R[i])-max(l,L[i])+1$ 数据范围比较大在线树套树的话明显过不了, ...

  9. Books Queries (codeforces 1066C)

    模拟题 开一个容器进行模拟即可,注意容器设置初始大小不然容易re.设置两个指针l,r.把容器当作桶,每一个桶都有一个编号表示位置,左边进入那么就是编号为l,右边一样.然后l--或者r++,l=r=0的 ...

随机推荐

  1. poj 1743 Musical Theme【后缀自动机】

    不是很神的一道题,一般. 先差分,最后答案需要+1. 一个right集的len即为该right集的最长相同后缀,考虑到不能重复,所以处理一下该right集的最大与最小的ri,最后答案ans=max(a ...

  2. POJ2559 Largest Rectangle in a Histogram —— 单调栈

    题目链接:http://poj.org/problem?id=2559 Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Lim ...

  3. cannot find -lbz2 解决方法

    sudo yum install -y bzip2* 或者sudo apt-get install bzip2* 还是报错就找到libbz2.so.1,建立连接或者复制到 /usr/lib/libbz ...

  4. python 二分法例子及冒泡排序

    #!/usr/bin/env python #-*- coding:utf-8 -*- def binary_search(source_data,find_nu): mid = len(source ...

  5. css font-family(字体样式)

    之前因为用的很少,所以没注意,最近做APP混合开发, 给字体一个样式    font-family:" 微软雅黑": 发现在有的手机上有效,但是在有的手机上是无效的, 解决方法:  ...

  6. tcp连接时,BROKEN PIPE错误的原因以及解决方法

    问题: 写了一个server和一个client,UNIX套接字的,server不断接收消息并打印出来,client是一个交互程序,输入一个消息回车发送,接着又可以输入消息.出问题了:当server监听 ...

  7. DLL的远程注入技术

    DLL的远程注入技术是目前Win32病毒广泛使用的一种技术.使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运 ...

  8. Android 常用adb shell 命令(转)

    调试Android程序有时需要adb shell 命令,adb全称Android Debug Bridge ,就是起到调试桥的作用. 通过adb我们可以在Eclipse中通过DDMS来调试Androi ...

  9. Linux 执行定时任务 shell脚本

    Linux上面执行定时任务,我们可以利用crontab -e直接编辑定时任务 另外我们还可以写好shell脚本,定时去执行shell脚本,这两个方法都可以起到定时执行的作用 下面我详细说一下入如何执行 ...

  10. c++中ctype常用函数总结(isprint isblank..)

    1 判断是否是二十六得字母中其中之一 isalpha(); #include <stdio.h> #include <ctype.h> #include <iostrea ...