Croc Champ 2013 - Round 1 E. Copying Data(线段树)
题目大意
给两个数组,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 数组中的数
参考代码
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 const int N=100006; 8 9 int A[N], B[N], n, m; 10 11 struct Interval_Tree 12 { 13 struct node 14 { 15 int s, t, bj, cs, ct; 16 void init(int a, int b) 17 { 18 s=a, t=b; 19 cs=ct=bj=0; 20 } 21 } T[N<<2]; 22 23 void build(int id, int L, int R) 24 { 25 T[id].init(L, R); 26 if(L==R) return; 27 int mid=(L+R)>>1; 28 build(id<<1, L, mid), build(id<<1|1, mid+1, R); 29 } 30 31 inline void pushDown(int id) 32 { 33 T[id<<1].cs=T[id].cs, T[id<<1|1].ct=T[id].ct; 34 int mid=(T[id].cs+T[id].ct)>>1; 35 T[id<<1].ct=mid, T[id<<1|1].cs=mid+1; 36 T[id].bj=0, T[id<<1].bj=1, T[id<<1|1].bj=1; 37 } 38 39 void update(int id, int L, int R, int x, int y) 40 { 41 if(L==T[id].s && T[id].t==R) 42 { 43 T[id].cs=x, T[id].ct=y; 44 T[id].bj=1; 45 return; 46 } 47 if(T[id].bj) pushDown(id); 48 int mid=(T[id].s+T[id].t)>>1; 49 if(R<=mid) update(id<<1, L, R, x, y); 50 else if(L>mid) update(id<<1|1, L, R, x, y); 51 else 52 { 53 update(id<<1, L, mid, x, x+mid-L); 54 update(id<<1|1, mid+1, R, x+mid-L+1, y); 55 } 56 } 57 58 int query(int id, int pos) 59 { 60 if(T[id].s==T[id].t) 61 { 62 if(T[id].bj) return T[id].cs; 63 else return -1; 64 } 65 if(T[id].bj) pushDown(id); 66 int mid=(T[id].s+T[id].t)>>1; 67 if(pos<=mid) return query(id<<1, pos); 68 else return query(id<<1|1, pos); 69 } 70 } tree; 71 72 int main() 73 { 74 scanf("%d%d", &n, &m); 75 for(int i=1; i<=n; i++) scanf("%d", &A[i]); 76 for(int i=1; i<=n; i++) scanf("%d", &B[i]); 77 tree.build(1, 1, n); 78 for(int i=0, t, x, y, k; i<m; i++) 79 { 80 scanf("%d", &t); 81 if(t==1) 82 { 83 scanf("%d%d%d", &x, &y, &k); 84 tree.update(1, y, y+k-1, x, x+k-1); 85 } 86 else 87 { 88 scanf("%d", &k); 89 x=tree.query(1, k); 90 if(x==-1) printf("%d\n", B[k]); 91 else printf("%d\n", A[x]); 92 } 93 } 94 return 0; 95 }
E. Copying Data
题目链接 & AC通道
Croc Champ 2013 - Round 1 E. Copying Data
转载于:https://www.cnblogs.com/zhj5chengfeng/archive/2013/05/14/3077580.html
Croc Champ 2013 - Round 1 E. Copying Data(线段树)相关推荐
- Croc Champ 2013 - Round 2 (Div. 2 Edition) 贪心+ 搜索+剪枝 + 数学
A: 直接找出最小值,看是否能被所有数整除即可 B: 判断是否出现连续的"#">=m若果存在肯定不能调. C: 题意: 两个人玩游戏(A,B),每个人分配一个字符串长度为2* ...
- “玲珑杯”ACM比赛 Round #21-C-战舰萝莉(线段树区间更新)
"玲珑杯"ACM比赛 Round #21 Start Time:2017-09-23 17:00:00 End Time:2017-09-23 19:30:00 Refresh T ...
- Educational Codeforces Round 96 E. String Reversa 线段树模拟序列交换
传送门 文章目录 题意: 思路: 题意: 思路: 与上一篇题解大同小异,无非就是不需要枚举排列了. // Problem: E. String Reversal // Contest: Codefor ...
- CodeforcesBeta Round #19 D. Points 离线线段树 单点更新 离散化
题目链接: http://codeforces.com/contest/19/problem/D 题意: 有三种操作"add x y"往平面上添加(x,y)这个点,"re ...
- Codeforces Global Round 7 E. Bombs(线段树)
题目: 给你一个置换,p1,p2,-,pn.假设排列的某些位置包含炸弹,这样至少存在一个没有炸弹的位置.对于某些固定的炸弹配置,请考虑以下过程.最初,有一个空集合,A.对于从1到n的每个i:将pi添加 ...
- Codeforces Round #413 C. Fountains (线段树的创建、查询、更新)
vj题目链接: https://vjudge.net/contest/235444#problem/F 题意: 有 n 个待建的喷泉,每个的建造代价为pi coins或者pi diamonds(co ...
- 解题报告(一)D、(CROC 2016 - Final Round C)Binary Table(矩阵 + 状态压缩 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- Codeforces Beta Round #75 (Div. 1 Only) B. Queue 线段树。单点更新
http://codeforces.com/problemset/problem/91/B 题意: 给你n个数,求得i 到n中小于a[i]的最右边的a[j],然后求a[i]到a[j]之间包含了多少个数 ...
- Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学
传送门 文章目录 题意: 思路: 题意: 思路: 考虑最终的序列是什么鸭子的,首先序列肯定单调不降,也就是a1≤a2≤a3≤...≤ana_1\le a_2\le a_3\le ...\le a_na ...
- Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点
传送门 文章目录 题意: 思路: 题意: 思路: 比较套路的一个题,我们维护一个dp[i]dp[i]dp[i]表示到了第iii行能保留的区间最多是多少. 转移比较明显:dp[i]=max(dp[j]) ...
最新文章
- 【转】判断UIViewController是否正在显示
- wpf 360软件管家_软件管家对比及推荐,避免全家桶的坑
- web后端学习过程中技巧总结(持续更新。。。)
- BZOJ #3064. Tyvj 1518 CPU监控(线段树,历史最值)
- 【python asyncio 运行报错】:raise RuntimeError(‘There is no current event loop in thread %r‘)
- 0基础必看:如何轻松成为C语言高手
- 深入探讨SDN拓扑发现机制:新的攻击及实践对策【SDN拓扑】(下)
- 3d相册 html 代码_女朋友生日,我送她网页相册,她感动的哭了(文中有惊喜)...
- Merge k Sorted Lists
- .net网络编程(4)TcpListener、TcpClient
- 用Not Exists 代替Not In
- 腾讯手游助手吃鸡一直服务器繁忙,腾讯手游助手里的吃鸡鼠标移动太快怎么办?...
- lte tm模式_TD―LTE TM8传输模式分析
- Power Apps 拍照上传
- 数据库使用率对比【CSDN指数】
- 【手把手教你】使用qstock实现量化策略选股
- 我为什么反对用各类框架
- OA协同办公系统 公共事务设置
- 太阳光轨迹软件_轻松画太阳视运动轨迹
- 微卡认证系统使用手册