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的 ...
随机推荐
- 【bzoj2809】dispatching
这题的最优解法是可并堆,从上往下合并及删点,标准的O(nlogn)解法. 为了练习主席树,特用主席树写一发,可以按dfs序建立主席树,对每个子树进行查询. 总时间5232毫秒,要垫底了... 看来需要 ...
- Android中点击事件的处理解析及常见问题
当我们手指按下时,Android采用层层传递-冒泡的方式处理点击事件.例如,现在公司来了个小项目,老板一看分配给经理做,经理一看分配给小组长,小组长一看好简单,分配给组员.如果在这个传递过 ...
- HDU2896 病毒侵袭 —— AC自动机
题目链接:https://vjudge.net/problem/HDU-2896 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- Codeforces Round #173 (Div. 2) E. Sausage Maximization —— 字典树 + 前缀和
题目链接:http://codeforces.com/problemset/problem/282/E E. Sausage Maximization time limit per test 2 se ...
- js日期和时间戳互换
<script> function js_strto_time(str_time){ var new_str = str_time.replace(/:/g,'-'); new_str = ...
- java运行Linux命令
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UT ...
- 支持源码单步调试QT库编译笔记
支持源码单步调试QT库编译笔记 编译环境:windows 10 编译工具:mingw_4_4_0 Qt源码版本:qt-everywhere-opensource-src-4.8.5(下载地址:http ...
- 【旧文章搬运】为什么win32k.sys在System进程空间无法访问
原文发表于百度空间,2010-01-02========================================================================== 玩过Sha ...
- Python学习资源汇总
Python 简明教程 (入门必看) * 在线浏览: http://woodpecker.org.cn/abyteofpython_cn/chinese/ Python Tutorial 简体中文版 ...
- Hearthstone
题意: 有$n$个无中生有,有$m$个不同的杀,第$i$个杀掉$X_i$滴血,敌人血量$P$,求问第一回合就将敌人杀死的概率是多少. 解法: 二进制枚举$A$类,$B$类卡的顺序,这样就确定了取了几个 ...