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. JS获取当前页面的URL

    如果获取“当前”域名 host = window.location.host; url=document.domain; url = window.location.href; 取得完整url路径: ...

  2. 很好的 DHCP协议与dhcpcd分析【转】

    本文转载自:http://blog.csdn.net/gjsisi/article/details/18052369 第一部分 DHCP工作过程 DHCP的工作过程主要分为以下六个阶段:     发现 ...

  3. 棋盘覆盖问题 (粉书 P230 【递归】** )

    转载自:http://blog.csdn.net/akof1314/article/details/5423608  (赞) 在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其它方格不 ...

  4. LightOJ1234 Harmonic Number —— 分区打表

    题目链接:https://vjudge.net/problem/LightOJ-1234 1234 - Harmonic Number    PDF (English) Statistics Foru ...

  5. Experimental Educational Round: VolBIT Formulas Blitz K. Indivisibility —— 容斥原理

    题目链接:http://codeforces.com/contest/630/problem/K K. Indivisibility time limit per test 0.5 seconds m ...

  6. C3P0 配置

    C3P0是一个开源的JDBC连接池. 在Spring中,C3P0的一些配置,介绍如下(只列了一部分,不是全部) <!-- c3p0连接池配置 --> <bean id="d ...

  7. 【概念】SVG(1)

    ok,我们讲讲svg 学习前提:懂HTML和基本的XML SVG简介: 1.SVG全称Scable Vector Graphic,可伸缩的矢量图 2.SVG用于定义针对于Web的基于矢量的图形 3.S ...

  8. 【转载】malloc和new

    1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对 ...

  9. 七号信令中TUP协议的主要消息和故障问题

      CIC码说明: TUP消息的路由标记: 为OPC 24位 DPC24位 CIC 12位,12位CIC 的低5为时隙号,其中后4位为SLC,高7位为系统号.     CIC配置需要注意几个问题:   ...

  10. 阻止Eclipse一直building workspace

    Eclipse 一直不停 building workspace完美解决总结 一.产生这个问题的原因多种 1.自动升级 2.未正确关闭 3.maven下载lib挂起 等.. 二.解决总结 (1).解决方 ...