Codeforce 292 E. Copying Data 解析(線段樹)

今天我們來看看CF292E

題目連結

題目

給你兩個陣列\(a,b\),有兩種操作:把\(a\)的一段複製到\(b\),或者查詢\(b\)的某個元素是什麼。

前言

去看其他人Submit的code會發現有其他做法,我的作法可能不是最好的,畢竟我對於單點查詢且無法維護區間值的線段樹不是很熟。

想法

首先察覺到這題有可能是線段樹,畢竟要維護一堆區間,然後還要查詢。

但是開始寫以後會察覺到:這是單點查詢,且我(們)想不到該維護什麼狀態才能夠把兩個不同區間的值合併到更大的區間中。我們本質上來說只是想要維護有哪些區間被修改而已,因此我們想到用懶標記(區間修改線段樹),「並且查詢時只查詢長度為一的區間」,也就是說,只有長度為一的區間所維護的值是有意義的,其他長度更長的區間只有維護的懶標記是有意義的。

因此,我們在線段樹的懶標記維護三個數字:\(\{x,y,k\}\),也就是題目給的三個數字,而長度為一的區間的值就是最後一次複製上去的\(\{x,y,k\}\)。

程式碼:

const int _n=1e5+10;
int tt,n,m,a[_n],b[_n],x,y,k;
struct M{int x,y,k;};
M res;
namespace Seg{
int nn;
M t[_n<<2],laz[_n<<2];
void pull(int v){}
void apply(int v, M val){t[v]=val,laz[v]=val;}
void push(int v){
if(laz[v].k!=0)apply(2*v+1,laz[v]),apply(2*v+2,laz[v]),laz[v]={0,0,0};
}
void build(int v, int l, int r){
if(l+1==r)t[v]={0,0,0};
else{int m=(l+r)>>1;build(2*v+1,l,m),build(2*v+2,m,r);pull(v);}
}
void add(int v,int l,int r,int ql,int qr,M val){
if(r<=ql or qr<=l)return;
else if(ql<=l and r<=qr)apply(v,val);
else{
push(v);int m=(l+r)>>1;
add(2*v+1,l,m,ql,qr,val),add(2*v+2,m,r,ql,qr,val);
pull(v);
}
}
void add(int l,int r,M val){add(0,0,nn,l,r,val);}
void add(int pos,M val){add(0,0,nn,pos,pos+1,val);}
void init(int n_){nn=n_;build(0,0,nn);}
void chk(int v,int l,int r,int pos){
int m=(l+r)>>1;if(l+1==r){res=t[v];return;}
push(v);
if(pos<m)chk(2*v+1,l,m,pos);
else chk(2*v+2,m,r,pos);
}
}
//上面是模板修改來的,所以函式名叫做add
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;rep(i,0,n)cin>>a[i];rep(i,0,n)cin>>b[i];
Seg::init(n);
while(m--){
cin>>tt;
if(tt==1){
cin>>x>>y>>k;x--,y--;
Seg::add(y,y+k,{x,y,k});
}
if(tt==2){
cin>>x;x--;
Seg::chk(0,0,n,x);
if(res.k!=0)cout<<a[res.x+(x-res.y)]<<'\n';
else cout<<b[x]<<'\n';
}
}
return 0;
};

標頭、模板請點Submission看

Submission

E. Copying Data 解析(線段樹)的更多相关文章

  1. D. Bash and a Tough Math Puzzle 解析(線段樹、數論)

    Codeforce 914 D. Bash and a Tough Math Puzzle 解析(線段樹.數論) 今天我們來看看CF914D 題目連結 題目 給你一個長度為\(n\)的數列\(a\), ...

  2. E. Enemy is weak 解析(思維、離散化、BIT、線段樹)

    Codeforce 61 E. Enemy is weak 解析(思維.離散化.BIT.線段樹) 今天我們來看看CF61E 題目連結 題目 給一個數列\(a\),求有多少\((i,j,k)\),\(i ...

  3. ACM: Copying Data 线段树-成段更新-解题报告

    Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...

  4. Croc Champ 2013 - Round 1 E. Copying Data 分块

    E. Copying Data time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  5. Croc Champ 2013 - Round 1 E. Copying Data 线段树

    题目链接: http://codeforces.com/problemset/problem/292/E E. Copying Data time limit per test2 secondsmem ...

  6. codeforces 292E. Copying Data

    We often have to copy large volumes of information. Such operation can take up many computer resourc ...

  7. codeforces 292E. Copying Data 线段树

    题目链接 给两个长度为n的数组, 两种操作. 第一种, 给出x, y, k, 将a[x, x+k-1]这一段复制到b[y, y+k-1]. 第二种, 给出x, 输出b[x]的值. 线段树区间更新单点查 ...

  8. json data 解析demo

    json data: demo: JsonObject jsonObject= JsonHandle.getAsJsonObject(city_dataInfo).get("data&quo ...

  9. bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie

    2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1116  Solved: 292[Submit][Status] ...

随机推荐

  1. appcan 文件下载与预览

    用appcan开发的app如何在手机上查看附件和预览附件呢?今天就为大家介绍一下,用APP看附件实大是太方便了. 1.直接上代码吧,首先要初始化插件用到的所有方法.这个方法中 cbIsFileExis ...

  2. tensorflow-GPU配置

    在使用GPU版的TensorFlow跑程序的时候,如果不特殊写代码注明,程序默认是占用所有主机上的GPU,但计算过程中只会用其中一块.也就是你看着所有GPU都被占用了,以为是在GPU并行计算,但实际上 ...

  3. C语言专项错题集

    2020-08-10 记录 #1 1 struct student{ 2 int num; 3 int age; 4 }; 5 struct student stu[3]={{6001,20},{60 ...

  4. 智慧组织(SO)如何敏捷构建?

    人类社会正处于千年未有之变局的关键时刻--互联网.大数据.AI和实体经济深度融合,数据正在重新定义世界并重构财富体系."新旧交织.破立并存",数字经济方兴未艾,传统势力逐步淡出.各 ...

  5. Kubernetes K8S之存储Secret详解

    K8S之存储Secret概述与类型说明,并详解常用Secret示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 ...

  6. 超详细的 Vagrant 上手指南

    搭建 Linux 虚拟机,别再用 VirtualBox 从 .iso 文件安装了. 概述 2020 年了,也许你已经习惯了 docker,习惯了在 XX 云上快速创建云主机,但是如果你想在个人电脑上安 ...

  7. Spring学习(八)--Spring的AOP

    自工作以后身不由己,加班无数,996.995不可控制,高高立起的flag无法完成,无奈,随波逐流,尽力而已! 1.advice通知 advice主要描述Spring AOP 围绕奥方法调用而注入的切面 ...

  8. Python-禅

    Python特点 1. 面向对象解释性编程语言 2. 简洁.优雅的编码风格 3. 跨平台 windows MacOS Linux 4. 丰富的标准库和第三方库 什么是编程? 解决现实中问题 什么是面向 ...

  9. PHP代码审计02之filter_var()函数缺陷

    前言 根据红日安全写的文章,学习PHP代码审计审计的第二节内容,题目均来自PHP SECURITY CALENDAR 2017,讲完这个题目,会有一道CTF题目来进行巩固,外加一个实例来深入分析,想了 ...

  10. spring-boot-route(一)Controller接收参数的几种方式

    Controller接收参数的常用方式总体可以分为三类.第一类是Get请求通过拼接url进行传递,第二类是Post请求通过请求体进行传递,第三类是通过请求头部进行参数传递. 1 @PathVariab ...