codeforces 292E. Copying Data
We often have to copy large volumes of information. Such operation can take up many computer resources. Therefore, in this problem you are advised to come up with a way to copy some part of a number array into another one, quickly.
More formally, you've got two arrays of integers a1, a2, ..., an and b1, b2, ..., bn of
length n. Also, you've got m queries of two types:
- Copy the subsegment of array a of length k, starting
from position x, into array b, starting from position y,
that is, execute by + q = ax + q for
all integer q (0 ≤ q < k). The given operation
is correct — both subsegments do not touch unexistent elements. - Determine the value in position x of array b, that
is, find value bx.
For each query of the second type print the result — the value of the corresponding element of array b.
The first line contains two space-separated integers n and m (1 ≤ n, m ≤ 105) —
the number of elements in the arrays and the number of queries, correspondingly. The second line contains an array of integers a1, a2, ..., an (|ai| ≤ 109).
The third line contains an array of integers b1, b2, ..., bn (|bi| ≤ 109).
Next m lines contain the descriptions of the queries. The i-th
line first contains integer ti —
the type of the i-th query (1 ≤ ti ≤ 2).
If ti = 1, then
the i-th query means the copying operation. If ti = 2,
then the i-th query means taking the value in array b.
If ti = 1, then
the query type is followed by three integers xi, yi, ki (1 ≤ xi, yi, ki ≤ n) —
the parameters of the copying query. If ti = 2,
then the query type is followed by integer xi (1 ≤ xi ≤ n) —
the position in array b.
All numbers in the lines are separated with single spaces. It is guaranteed that all the queries are correct, that is, the copying borders fit into the borders of arrays a and b.
For each second type query print the result on a single line.
5 10
1 2 0 -1 3
3 1 5 -2 0
2 5
1 3 3 3
2 5
2 4
2 1
1 2 1 4
2 1
2 4
1 4 2 1
2 2
0
3
-1
3
2
3
-1
题意:给你两个数字序列a[]和b[],有两种操作,一种是把起点为xi,长度为k的a[]的一段复制给以yi为起点,长度为k的b[],还有一种操作是询问当前b[x]的数字是什么。
思路:
这道题可以用线段树成段更新做,属于染色一类线段树题目,可以这么想,对于任意一个数,记录它有没有被a[]的其中一段覆盖了,如果被覆盖了,可以记录它被覆盖的a[]的那段的起点stra以及b[]被覆盖的起点strb,如果被覆盖,那么最后结果就是a[x1+strb-stra]。stra表示这一线段是否被a[]数组覆盖,如果没有覆盖,那么stra=0,如果覆盖,那么被a[]覆盖的区间范围是a[stra]~a[stra+k-1],strb同理,只不过记录的是b[]的开始位置。
对于操作1,输入x1,y1,k,只要使得区间[y1,y1+k-1]的stra变成x1,strb变成y1.
对于操作2,输入x1,在线段树中寻找,如果这一点(即[x1,x1])的stra是0,就输出c[x1],否则输出a[x1+strb-stra].
#include<stdio.h>
#include<string.h>
#define maxn 100006
int a[maxn],c[maxn];
int st1,st2,x1,y1,k;
struct node
{
int l,r,stra,strb;
}b[4*maxn]; void build(int l,int r,int i)
{
int mid;
b[i].l=l;b[i].r=r;b[i].stra=b[i].strb=0;
if(l==r)return;
mid=(l+r)/2;
build(l,mid,i*2);
build(mid+1,r,i*2+1);
} void update(int l,int r,int i) //stra=x1,strb=y1;
{
int mid;
if(b[i].stra==x1 && b[i].strb==y1)return;
if(b[i].l==l && b[i].r==r){
b[i].stra=x1;b[i].strb=y1;return;
}
if(b[i].stra!=-1){
b[i*2].stra=b[i*2+1].stra=b[i].stra;
b[i*2].strb=b[i*2+1].strb=b[i].strb;
b[i].stra=b[i].strb=-1;
}
mid=(b[i].l+b[i].r)/2;
if(r<=mid)update(l,r,i*2);
else if(l>mid) update(l,r,i*2+1);
else {
update(l,mid,i*2);update(mid+1,r,i*2+1);
}
} void question(int id,int i)
{
int mid;
if(b[i].stra!=-1){
st1=b[i].stra;st2=b[i].strb;return;
}
mid=(b[i].l+b[i].r)/2;
if(id<=mid) question(id,i*2);
else question(id,i*2+1);
} int main()
{
int n,m,i,j,h,d,e,f,x;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++){
scanf("%d",&c[i]);
}
build(1,n,1);
while(m--){
scanf("%d",&h);
if(h==1){
scanf("%d%d%d",&x1,&y1,&k);
update(y1,y1+k-1,1);
}
else if(h==2){
scanf("%d",&x);
st1=st2=0;
question(x,1);
if(st1==0){
printf("%d\n",c[x]);continue;
}
else {
printf("%d\n",a[x-st2+st1]);continue;
}
}
}
}
return 0;
}
codeforces 292E. Copying Data的更多相关文章
- codeforces 292E. Copying Data 线段树
题目链接 给两个长度为n的数组, 两种操作. 第一种, 给出x, y, k, 将a[x, x+k-1]这一段复制到b[y, y+k-1]. 第二种, 给出x, 输出b[x]的值. 线段树区间更新单点查 ...
- Croc Champ 2013 - Round 1 E. Copying Data 线段树
题目链接: http://codeforces.com/problemset/problem/292/E E. Copying Data time limit per test2 secondsmem ...
- 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 ...
- E. Copying Data 解析(線段樹)
Codeforce 292 E. Copying Data 解析(線段樹) 今天我們來看看CF292E 題目連結 題目 給你兩個陣列\(a,b\),有兩種操作:把\(a\)的一段複製到\(b\),或者 ...
- Codeforces 950.E Data Center Maintenance
E. Data Center Maintenance time limit per test 1 second memory limit per test 512 megabytes input st ...
- 14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器
14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器 这个章节描述技术关于移动或者复制一些或者所 ...
- 14.6.2 Moving or Copying InnoDB Tables to Another Machine 移动或者copy InnoDB 表到另外的机器
14.6.2 Moving or Copying InnoDB Tables to Another Machine 移动或者copy InnoDB 表到另外的机器 这个章节描述技术关于移动或者copy ...
- [Windows Azure] Data Management and Business Analytics
http://www.windowsazure.com/en-us/develop/net/fundamentals/cloud-storage/ Managing and analyzing dat ...
随机推荐
- 【Spring】Spring JdbcTemplate
Spring JdbcTemplate 文章源码 JdbcTemplate 概述 它是 Spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装.Spring 框架提供了很多的操 ...
- LeetCode703 流中第k大的元素
前言: 我们已经介绍了二叉搜索树的相关特性,以及如何在二叉搜索树中实现一些基本操作,比如搜索.插入和删除.熟悉了这些基本概念之后,相信你已经能够成功运用它们来解决二叉搜索树问题. 二叉搜索树的有优点是 ...
- 内存性能测试 Memtester+mbw
Memtester简单介绍 Memtester主要是捕获内存错误和一直处于很高或者很低的坏位, 其测试的主要项目有随机值,异或比较,减法,乘法,除法,与或运算等等. 通过给定测试内存的大小和次数, 可 ...
- 【Linux】在文件的指定位置插入数据
今天遇到一个似乎很棘手的问题,要在文件的中间,插入几条配置 这里就以my.cnf这个文件为例 1 [mysqld] 2 datadir=/var/lib/mysql 3 socket=/var/lib ...
- Linux下Too many open files问题排查与解决
作者: Grey 原文地址: Github 语雀 博客园 Too many open files是Linux系统中常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的 ...
- C语言目的概念(C语言学习笔记)
什么是目 目是针对操作符来说的,一个操作符影响两个操作数就表示该操作符为双目运算符 举个例子: 1+2 这里的加号影响了1和2两个操作数,所以"+"就是双目运算符 +1,-1 这里 ...
- eCATT使用前的配置
如果想在SAP中使用eCATT,必须做一下相关的配置才行,下面简单介绍这几步:1.SM30,输入表T000,然后点击维护,或者是进入事物SCC4,进入对应的clint属性编辑视图下,将CATT and ...
- PAT练习num3-跟奥巴马一起学编程
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝"计算机科学教育周"正式启动,奥巴马编写了很简单的计算机 ...
- MYSQL基础知识的复习1
数据库(是存放数据的仓库) 1.根据存储量以及安全性上来划分: 大型数据库:DB2 Oracle(毕业) Hbase 银行 公安局(不加班 没网) 移动 中型数据库:mysql sqlserver(. ...
- 查看内核打印信息指令dmesg
linux系统启动的时候打印的的信息非常重要,有时候需要看这些信息但是又不想重启,可以用dmesg这条指令.