Croc Champ 2013 - Round 1 E. Copying Data(线段树)
2013-05-14 12:36
375 查看
题目大意
给两个数组,A 和 B,以及 m 个操作。每个数组中保存 n 个数,操作分两类:1 x y k :把 A 数组中的 [x, x+k-1] 这个区间中的数复制到 B 数组中 [y, y+k-1] 去
2 x 询问 B 数组中,第 x 个数是多少
题目保证复制和查询操作是合法的
其中:1≤n,m≤105
做法分析
基础线段树,节点中保存的信息是:这一个区间是否被 A 数组覆盖,如果是,对应了 A 数组中的哪个区间,然后就是按照操作在线的模拟就行了注意:
复制操作是后来居上的,会把全面的覆盖掉
如果当前点没有被覆盖,那么查询的时候输出的是 B 数组中原来在这个位置上的数,否则输出对应 A 数组中的数
参考代码
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=100006; int A , B , n, m; struct Interval_Tree { struct node { int s, t, bj, cs, ct; void init(int a, int b) { s=a, t=b; cs=ct=bj=0; } } T[N<<2]; void build(int id, int L, int R) { T[id].init(L, R); if(L==R) return; int mid=(L+R)>>1; build(id<<1, L, mid), build(id<<1|1, mid+1, R); } inline void pushDown(int id) { T[id<<1].cs=T[id].cs, T[id<<1|1].ct=T[id].ct; int mid=(T[id].cs+T[id].ct)>>1; T[id<<1].ct=mid, T[id<<1|1].cs=mid+1; T[id].bj=0, T[id<<1].bj=1, T[id<<1|1].bj=1; } void update(int id, int L, int R, int x, int y) { if(L==T[id].s && T[id].t==R) { T[id].cs=x, T[id].ct=y; T[id].bj=1; return; } if(T[id].bj) pushDown(id); int mid=(T[id].s+T[id].t)>>1; if(R<=mid) update(id<<1, L, R, x, y); else if(L>mid) update(id<<1|1, L, R, x, y); else { update(id<<1, L, mid, x, x+mid-L); update(id<<1|1, mid+1, R, x+mid-L+1, y); } } int query(int id, int pos) { if(T[id].s==T[id].t) { if(T[id].bj) return T[id].cs; else return -1; } if(T[id].bj) pushDown(id); int mid=(T[id].s+T[id].t)>>1; if(pos<=mid) return query(id<<1, pos); else return query(id<<1|1, pos); } } tree; int main() { scanf("%d%d", &n, &m); for(int i=1; i<=n; i++) scanf("%d", &A[i]); for(int i=1; i<=n; i++) scanf("%d", &B[i]); tree.build(1, 1, n); for(int i=0, t, x, y, k; i<m; i++) { scanf("%d", &t); if(t==1) { scanf("%d%d%d", &x, &y, &k); tree.update(1, y, y+k-1, x, x+k-1); } else { scanf("%d", &k); x=tree.query(1, k); if(x==-1) printf("%d\n", B[k]); else printf("%d\n", A[x]); } } return 0; }
E. Copying Data
题目链接 & AC通道
Croc Champ 2013 - Round 1 E. Copying Data相关文章推荐
- Croc Champ 2013 - Round 1 E. Copying Data 线段树
- Croc Champ 2013 - Round 1 E. Copying Data 分块
- Croc Champ 2013 - Round 2 (Div. 2 Edition) A题
- Croc Champ 2013 - Round 2 Div. 2 D
- 函数路径Croc Champ 2013 - Round 2 题解-java教程
- Croc Champ 2013 - Round 2 题解
- Croc Champ 2013 - Round 1 B. Network Topology
- Croc Champ 2013 - Round 2 (Div. 2 Edition) C. Weird Game
- Croc Champ 2013 - Round 2 (Div. 2 Edition)——A,B,C
- Croc Champ 2013 - Round 2 (Div. 2 Edition) A. Ksusha and Array
- Croc Champ 2013 - Round 1(完全)
- Croc Champ 2013 - Round 2 (Div. 2 Edition) 贪心+ 搜索+剪枝 + 数学
- Croc Champ 2013 - Round 2 (Div. 2 Edition)-C Weird Gam
- Croc Champ 2013 - Round 2 (Div. 2 Edition) C
- Croc Champ 2013 - Round 1——E
- Croc Champ 2013 - Round 2 题解
- Croc Champ 2013 - Round 2 (Div. 2 Edition) E. Cube Problem 解题报告
- Codeforces 292 E. Copying Data (线段树)
- CF Croc Champ 2013 - Finals (online version, Div. 1) C(greedy)
- Croc Champ 2013 - Finals (online version, Div. 1)