E. Copying Data 解析(線段樹)
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 解析(線段樹)的更多相关文章
- D. Bash and a Tough Math Puzzle 解析(線段樹、數論)
Codeforce 914 D. Bash and a Tough Math Puzzle 解析(線段樹.數論) 今天我們來看看CF914D 題目連結 題目 給你一個長度為\(n\)的數列\(a\), ...
- E. Enemy is weak 解析(思維、離散化、BIT、線段樹)
Codeforce 61 E. Enemy is weak 解析(思維.離散化.BIT.線段樹) 今天我們來看看CF61E 題目連結 題目 給一個數列\(a\),求有多少\((i,j,k)\),\(i ...
- ACM: Copying Data 线段树-成段更新-解题报告
Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...
- 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 ...
- Croc Champ 2013 - Round 1 E. Copying Data 线段树
题目链接: http://codeforces.com/problemset/problem/292/E E. Copying Data time limit per test2 secondsmem ...
- codeforces 292E. Copying Data
We often have to copy large volumes of information. Such operation can take up many computer resourc ...
- codeforces 292E. Copying Data 线段树
题目链接 给两个长度为n的数组, 两种操作. 第一种, 给出x, y, k, 将a[x, x+k-1]这一段复制到b[y, y+k-1]. 第二种, 给出x, 输出b[x]的值. 线段树区间更新单点查 ...
- json data 解析demo
json data: demo: JsonObject jsonObject= JsonHandle.getAsJsonObject(city_dataInfo).get("data&quo ...
- bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1116 Solved: 292[Submit][Status] ...
随机推荐
- 一道无限极类 PHP 试题
记某次笔试碰到的一道无限极类试题,当时时间比较紧(满满六页试题),还是手写代码,所以最终写的有点错误.记不住原题了,但是要求都知道,特此记录下来! 试题 有下面一个数组: $arr = [ '小红' ...
- scala 传值调用,传名调用
Scala的解释器在解析函数参数(function arguments)时有两种方式: 传值调用(call-by-value):先计算参数表达式的值,再应用到函数内部: 传名调用(call-by-na ...
- GAN训练技巧汇总
GAN自推出以来就以训练困难著称,因为它的训练过程并不是寻找损失函数的最小值,而是寻找生成器和判别器之间的纳什均衡.前者可以直接通过梯度下降来完成,而后者除此之外,还需要其它的训练技巧. 下面对历年关 ...
- 别人写的很好Arduino教材
原文来自:https://www.arduino.cn/thread-31720-1-1.html 上一篇:Arduino教程--通过 库管理器 添加库 http://www.arduino.cn/t ...
- 如何确定芯片pin1的位置
来源:https://www.raviyp.com/embedded/150-identifying-pin-no-1-on-an-ic Identifying pin no 1 on an IC R ...
- Arduino 寻找I2C地址address
参考:http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/arduino-quick-tip-fin ...
- 题解 SP1026 【FAVDICE - Favorite Dice】
首先,这是一道经典的期望dp题 因为最终状态 $ (所有面都被筛到过) $ 是确定的,所以才用 逆推 ,设状态 $ f[i] $ 表示已经筛到了 $ i $ 个不同的面,有 $ i\over n $ ...
- 轻轻松松学CSS:Grid布局
网页布局总的来说经历了以下四个阶段: 1.古老的table表格布局,现在基本已被淘汰. 2.float浮动布局(或者position定位布局),借助float.position 等属性等进行布局,这种 ...
- Python+Appium自动化测试(9)-自动选择USB用于传输文件(不依赖appium对手机页面元素进行定位)
一,问题 app自动化测试使用Android真机连接电脑时,通常会遇到两种情况: 1.测试机连接电脑会弹窗提示USB选项,选择USB用于"传输文件",有些手机不支持设置默认USB选 ...
- 同一台电脑同时使用gitHub和gitLab
工作中我们有时可能会在同一台电脑上使用多个git账号,例如:公司的gitLab账号,个人的gitHub账号.怎样才能在使用gitlab与github时,切换成对应的账号,并且免密?这时我们需要使用ss ...