题目大意:
  给你一个长度为n的数列a,按顺序进行以下m次操作,每次将区间[l,r]中的所有x变成y,问最后数列是怎样的。

思路:
  线段树。
  每个线段树结点上维护当前区间每个数分别会变成多少。时间复杂度O(m log n)。然而比别人Ofast+循环展开+特定指令集的O(nm)暴力还慢。

 #include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=,A=;
int a[N];
class SegmentTree {
#define _left <<1
#define _right <<1|1
private:
int val[N<<][A];
void push_down(const int &p) {
for(register int i=;i<A;i++) {
val[p _left][i]=val[p][val[p _left][i]];
val[p _right][i]=val[p][val[p _right][i]];
}
for(register int i=;i<=A;i++) val[p][i]=i;
}
public:
void build(const int &p,const int &b,const int &e) {
for(register int i=;i<A;i++) {
val[p][i]=i;
}
if(b==e) return;
const int mid=(b+e)>>;
build(p _left,b,mid);
build(p _right,mid+,e);
}
void modify(const int &p,const int &b,const int &e,const int &l,const int &r,const int &x,const int &y) {
if(b==l&&e==r) {
for(register int i=;i<A;i++) {
if(val[p][i]==x) val[p][i]=y;
}
return;
}
push_down(p);
const int mid=(b+e)>>;
if(l<=mid) modify(p _left,b,mid,l,std::min(mid,r),x,y);
if(r>mid) modify(p _right,mid+,e,std::max(mid+,l),r,x,y);
}
void stat(const int &p,const int &b,const int &e) {
if(b==e) {
a[b]=val[p][a[b]];
return;
}
push_down(p);
const int mid=(b+e)>>;
stat(p _left,b,mid);
stat(p _right,mid+,e);
}
#undef _left
#undef _right
};
SegmentTree t;
int main() {
const int n=getint();
for(register int i=;i<=n;i++) {
a[i]=getint();
}
t.build(,,n);
for(register int q=getint();q;q--) {
const int l=getint(),r=getint(),x=getint(),y=getint();
t.modify(,,n,l,r,x,y);
}
t.stat(,,n);
for(register int i=;i<=n;i++) {
printf("%d%c",a[i]," \n"[i==n]);
}
return ;
}

  O(n^2)卡常版本:

 #pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<cstdio>
inline char getint8() {
register char ch;
while(!__builtin_isdigit(ch=getchar()));
register char x=ch^'';
while(__builtin_isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
inline int getint32() {
register char ch;
while(!__builtin_isdigit(ch=getchar()));
register int x=ch^'';
while(__builtin_isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
int n,m,l,r;
char x,y,a[];
int main() {
n=getint32();
for(register int i=;i<n;i++) a[i]=getint8();
for(register int m=getint32();m;m--) {
l=getint32(),r=getint32(),x=getint8(),y=getint8();
for(l--;l<r;l++) {
if(__builtin_expect(a[l]==x,)) a[l]=y;
}
}
for(register int i=;i<n;i++) {
printf("%hhu%c",a[i]," \n"[i==n]);
}
return ;
}

[CF911G]Mass Change Queries的更多相关文章

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

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

  2. codefroces 911G Mass Change Queries

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

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

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

  4. Mass Change Queries Codeforces - 911G

    https://codeforces.com/contest/911/problem/G 没想到线段树合并还能这么搞.. 对每个权值建一个线段树(动态开点),如果权值为k的线段树上第i位为1,那么表示 ...

  5. Educational Codeforces Round 35

    Nearest Minimums 相同的数里最小的数里的最小距离 Solution Two Cakes Solution Three Garlands 瞎比试 Solution Inversion C ...

  6. How To Do Master Record Mass Maintenance

    How To Do Master Record Mass Maintenance Which master records mass maintenance can be done? What do ...

  7. SAP事务码 一

    SE80 -- edit source code. SE24 -- class create or display. SFP -- created and maintained independent ...

  8. 解析大型.NET ERP系统 十三种界面设计模式

    成熟的ERP系统的界面应该都是从模板中拷贝出来的,各类功能的界面有规律可遵循.软件界面设计模式化或是艺术性的创作,我认可前者,模式化的界面客户容易举一反三,降低学习门槛.除了一些小部分的功能界面设计特 ...

  9. Database Schemas Found in Oracle E-Business Suite

    https://docs.oracle.com/cd/E26401_01/doc.122/e22952/T156458T659606.htm Table of Database Schemas in ...

随机推荐

  1. idea中mybatis-plugin破解

    Mybatis Plugin 一.Mybatis Plugin插件是什么 提供Mapper接口与配置文件中对应SQL的导航 编辑XML文件时自动补全 根据Mapper接口, 使用快捷键生成xml文件及 ...

  2. IDEA 使用maven创建web项目,打包war时不会创建class文件

    使用maven创建项目后我有创建了个src的目录,导致maven编译不能识别我创建的src文件下的Java文件 修改这样后就可以识别编译Java文件 今天又给自己挖了个坑.......

  3. jspersonft有关Table数据绑定(一)

    一:前言 在公司来就学着做报表,觉得这个报表学着还是很有意义的.jspersonft我在网上搜了一些有关的资料但是不是很多,现在就是学一点就记载一点.好记性不如烂笔头嘛! 二:在jspersonft定 ...

  4. noip2016 普及组

    T1 买铅笔 题目传送门 #include<cstdio> #include<cstring> #include<algorithm> using namespac ...

  5. 【BZOJ】2442: [Usaco2011 Open]修剪草坪

    [算法]动态规划 [题解] 万物皆动规,每时每刻都要想着DP!特别是这种明显可以序列递推的题目. 一个简单的思路是f[i]表示前i个选择合法方案(第i个可选可不选)的最大效率 f[i]=max(f[i ...

  6. swift出师作,史丹佛大学游戏制作案例,计算器,小游戏

    这两个案例得好好弄清楚,感觉在任何方面既然能够作为公开课被提到这所名校的课程里面自然有不得不学习的理由,感觉应该去入手一下,毕竟这种课,价格不匪,难以接触,能看到就当再教育了.

  7. unet中可视性检查的一些笔记

    最近在尝试用unet做一个局域网游戏,游戏的核心概念在于玩家之间的发现和隐蔽,有个类似于战争迷雾的机制. 实现该机制最关键的是实现可视性检查.首先是unet中默认的一个可视性检查,由组件Network ...

  8. bzoj 2662&bzoj 2763 SPFA变形

    我们用dis[i,j]代表到i这个点,用j张票的最短路程,那么我们只需要在SPFA更新 的时候,用dis[i,j]更新dis[p,j]和dis[p,j+1]就行了 /***************** ...

  9. bzoj 2753 最小生成树变形

    我们根据高度建图,将无向边转化为有向边 首先对于第一问,直接一个bfs搞定,得到ans1 然后第二问,我们就相当于要求找到一颗最小生成树, 满足相对来说深度小的高度大,也就是要以高度为优先级 假设现在 ...

  10. django unresolved template

    参考:https://stackoverflow.com/questions/8487410/pycharm-django-1-3-static-url-in-templates-unresolved ...