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] ...
随机推荐
- ch4inrulz: 1.0.1靶机渗透
ch4inrulz: 1.0.1靶机渗透 扫描主机端口,还行啦四个开放的端口,8011和80端口都运行着web服务. 80端口下的robots.txt告诉我们什么都没有 在8011端口的apache服 ...
- 你可能不知道的 Date 类
Date 是 JS 中的重要的一个内置对象,其实例主要用于处理时间和日期,其时间基于 1970-1-1 (世界标准时间)起的毫秒数,时间戳长度为 13 位(不同于 Unix 时间戳的长度 10 位). ...
- Python-嵌套列表变成普通列表
如何把[1, 5, 6, [2, 7, [3, [4, 5, 6]]]]变成[1, 5, 6, 2, 7, 3, 4, 5, 6]? 思考: -- for循环每次都遍历列表一层 -- 把取出的单个值加 ...
- 依赖注入在 dotnet core 中实现与使用:4. 集成 Autofac
本示例使用 .net core 5 rc-1 实现. 1. 添加 Nuget 包引用 使用 Autofac 当然要添加 Autofac 的 Nuget 包,主要涉及到两个: Autofac.Exten ...
- 在.NET中使用DiagnosticSource
前言 DiagnosticSource是一个非常有意思的且非常有用的API,对于这些API它们允许不同的库发送命名事件,并且它们也允许应用程序订阅这些事件并处理它们,它使我们的消费者可以在运行时动态发 ...
- 安装haproxy
安装依赖 yum install -y gcc pcre pcre-devel openssl openssl-devel 创建依赖账号,并禁止账号登录 useradd -M -s /sbin/nol ...
- install Wine + WeChat in Fedora 31
install Wine + WeChat in Fedora 31 dnf -y install dnf-plugins-core dnf config-manager --add-repo htt ...
- Brew error: Could not symlink, path is not writable
As explained here by Rick: Start with brew doctor which will show you errors with your brew setup. Y ...
- 用ip xfrm搭ipsec隧道
拓扑如下 基本的IP配置就不说了,直接写重点,在LS上配置 #配置SA ip xfrm state add src 194.168.10.4 dst 194.168.10.5 proto esp sp ...
- 工业级wifi模块
工业级wifi模块 工业级wifi模块ZLSN7004是上海卓岚开发的一款高性能的Wifi.以太网转串口模块.与普通的wifi模块定位在低成本不同,7004定位在高稳定性.丰富功能,设计目标是面向对功 ...