题目大意

给两个数组,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(线段树)相关推荐

  1. Croc Champ 2013 - Round 2 (Div. 2 Edition) 贪心+ 搜索+剪枝 + 数学

    A: 直接找出最小值,看是否能被所有数整除即可 B: 判断是否出现连续的"#">=m若果存在肯定不能调. C: 题意: 两个人玩游戏(A,B),每个人分配一个字符串长度为2* ...

  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 ...

  3. Educational Codeforces Round 96 E. String Reversa 线段树模拟序列交换

    传送门 文章目录 题意: 思路: 题意: 思路: 与上一篇题解大同小异,无非就是不需要枚举排列了. // Problem: E. String Reversal // Contest: Codefor ...

  4. CodeforcesBeta Round #19 D. Points 离线线段树 单点更新 离散化

    题目链接: http://codeforces.com/contest/19/problem/D 题意: 有三种操作"add x y"往平面上添加(x,y)这个点,"re ...

  5. Codeforces Global Round 7 E. Bombs(线段树)

    题目: 给你一个置换,p1,p2,-,pn.假设排列的某些位置包含炸弹,这样至少存在一个没有炸弹的位置.对于某些固定的炸弹配置,请考虑以下过程.最初,有一个空集合,A.对于从1到n的每个i:将pi添加 ...

  6. Codeforces Round #413 C. Fountains (线段树的创建、查询、更新)

     vj题目链接: https://vjudge.net/contest/235444#problem/F 题意: 有 n 个待建的喷泉,每个的建造代价为pi coins或者pi diamonds(co ...

  7. 解题报告(一)D、(CROC 2016 - Final Round C)Binary Table(矩阵 + 状态压缩 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  8. 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]之间包含了多少个数 ...

  9. Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑最终的序列是什么鸭子的,首先序列肯定单调不降,也就是a1≤a2≤a3≤...≤ana_1\le a_2\le a_3\le ...\le a_na ...

  10. Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点

    传送门 文章目录 题意: 思路: 题意: 思路: 比较套路的一个题,我们维护一个dp[i]dp[i]dp[i]表示到了第iii行能保留的区间最多是多少. 转移比较明显:dp[i]=max(dp[j]) ...

最新文章

  1. 【转】判断UIViewController是否正在显示
  2. wpf 360软件管家_软件管家对比及推荐,避免全家桶的坑
  3. web后端学习过程中技巧总结(持续更新。。。)
  4. BZOJ #3064. Tyvj 1518 CPU监控(线段树,历史最值)
  5. 【python asyncio 运行报错】:raise RuntimeError(‘There is no current event loop in thread %r‘)
  6. 0基础必看:如何轻松成为C语言高手
  7. 深入探讨SDN拓扑发现机制:新的攻击及实践对策【SDN拓扑】(下)
  8. 3d相册 html 代码_女朋友生日,我送她网页相册,她感动的哭了(文中有惊喜)...
  9. Merge k Sorted Lists
  10. .net网络编程(4)TcpListener、TcpClient
  11. 用Not Exists 代替Not In
  12. 腾讯手游助手吃鸡一直服务器繁忙,腾讯手游助手里的吃鸡鼠标移动太快怎么办?...
  13. lte tm模式_TD―LTE TM8传输模式分析
  14. Power Apps 拍照上传
  15. 数据库使用率对比【CSDN指数】
  16. 【手把手教你】使用qstock实现量化策略选股
  17. 我为什么反对用各类框架
  18. OA协同办公系统 公共事务设置
  19. 太阳光轨迹软件_轻松画太阳视运动轨迹
  20. 微卡认证系统使用手册

热门文章

  1. 理解 Visual C++ 应用程序的依赖项(msdn)
  2. ubuntu下配置开机启动服务
  3. 计算机培训中学语文研修计划,初中语文个人研修计划书
  4. SendMessage 函数
  5. UGUI的Canvas Scaler
  6. JVM学习03-常用Java虚拟机参数
  7. mac bigsur 360极速浏览器闪退问题解决方法
  8. sqlerver 字符串转整型_Sqlerver进行模糊查询like和转义字符
  9. 做一个简单的python爬虫_python制作一个简单网络爬虫
  10. 记录一个手写场景的过程