[CF911G]Mass Change Queries
题目大意:
给你一个长度为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的更多相关文章
- CF911G Mass Change Queries(线段树+暴力)
cf机子真的快. 其实这个题的维护的信息还是很巧妙的. 首先,观察到题目中涉及到,区间修改这个操作,然后最后只查询一次,我们不妨用线段树来维护这个过程. 但是貌似直接维护每个位置的值可能不太好维护. ...
- codefroces 911G Mass Change Queries
题意翻译 给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列. 输入输出格式 输入格式: The first line contains one intege ...
- Mass Change Queries CodeForces - 911G (线段树合并)
链接 大意: 给定序列, 每次操作将区间[l,r]中的x全改为y, 最后输出序列 权值范围比较小, 对每个权值开一颗线段树, 每次将x合并到y上即可 #include <iostream> ...
- Mass Change Queries Codeforces - 911G
https://codeforces.com/contest/911/problem/G 没想到线段树合并还能这么搞.. 对每个权值建一个线段树(动态开点),如果权值为k的线段树上第i位为1,那么表示 ...
- Educational Codeforces Round 35
Nearest Minimums 相同的数里最小的数里的最小距离 Solution Two Cakes Solution Three Garlands 瞎比试 Solution Inversion C ...
- How To Do Master Record Mass Maintenance
How To Do Master Record Mass Maintenance Which master records mass maintenance can be done? What do ...
- SAP事务码 一
SE80 -- edit source code. SE24 -- class create or display. SFP -- created and maintained independent ...
- 解析大型.NET ERP系统 十三种界面设计模式
成熟的ERP系统的界面应该都是从模板中拷贝出来的,各类功能的界面有规律可遵循.软件界面设计模式化或是艺术性的创作,我认可前者,模式化的界面客户容易举一反三,降低学习门槛.除了一些小部分的功能界面设计特 ...
- 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 ...
随机推荐
- fresco的使用教程
1.加载依赖 api 'org.xutils:xutils:3.5.0' 2.创建一个myapplication public class MyApplication extends Applicat ...
- Robot POJ - 1376
The Robot Moving Institute is using a robot in their local store to transport different items. Of co ...
- webpack 的第三方库分离并持久化缓存
我们常常需要在浏览器缓存一些稳定的资源,如第三方库等.要达到这个目标,只需要两步: 1.提取出“稳定的资源”: 2.提供稳定的文件hash . 处理后的出的文件就像这样子: app.1w3ad4q4. ...
- java简单发送邮件
需要的jar 据说是: <dependency> <groupId>javax.mail</groupId> <artifactId>mail</ ...
- 【bzoj1010-toy】斜率优化入门模板
dsy1010: [HNOI2008]玩具装箱 [题目描述] 有n个数,分成连续的若干段,每段(假设从第j个到第i个组成一段)的分数为 (X-L)^2,X为j-i+Sigma(Ck) i<=k& ...
- codevs 3305 水果姐逛水果街Ⅱ&&codevs3006
题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~ ...
- JS形参与实参问题
JavaScript的参数传递也都是采用值传递的方式进行传值. (1) 通过实参调用函数的时候,传入函数里的是实参的副本而不是实参,因此在函数里面修改参数值并不会对实参造成影响. 例如:将全局 ...
- POJ3264(线段树求区间最大最小值)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 41162 Accepted: 19327 ...
- 打包工具 Inno Setup 5
转载: http://www.360doc.com/content/13/0327/13/4221543_274235049.shtml
- Makefile PHONY
case 1: Makefile clean: rm a environment_1 : There is only file a $ make clean clean a environment_2 ...