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 ...
随机推荐
- LeetCode701 二叉搜索树中插入结点
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 保证原始二叉搜索树中不存在新值. 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜 ...
- 使用OpenCV进行简单的人像分割与合成
图像合成 实现思路 通过背景建模的方法,对源图像中的动态人物前景进行分割,再将目标图像作为背景,进行合成操作,获得一个可用的合成影像. 实现步骤如下. 使用BackgroundSubtractorMO ...
- 为什么[] == false 为true
首先要讲一下js的数据类型分为: 1.基本数据类型(原始数据类型):String.Boolean.Number.null.undefined.Symbol 2.引用数据类型:Object.Array. ...
- codeup 1934 查找元素
题目描述: 输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1. 输入: 测试数据有多组,输入n(1<=n<=200), ...
- 使用git上传代码到github远程仓库
一.新建代码库注册好github登录后,首先先在网页上新建代码库. 点击右上角"+"→New repository 进入如下页面:按照要求填写完成后,点击按钮创建代码库创建成功. ...
- API服务接口签名代码与设计,如果你的接口不走SSL的话?
在看下面文章之前,我们先问几个问题 rest 服务为什么需要签名? 签名的几种方式? 我认为的比较方便的快捷的签名方式(如果有大神持不同意见,可以交流!)? 怎么实现验签过程 ? 开放式open ap ...
- hook笔记②
- 阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性公网IP是独立的公网IP资源,可以绑定到阿里云专有网络VPC类型的ECS、NAT网关、私网负载均衡SLB上,并可以动态解绑,实现公网IP和ECS、NAT网关、SLB的解耦,满足灵活管理的要求。阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性络VPC类型的E
阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性公网IP是独立的公网关.私网负载均衡SLB上,并可以动态解绑,实现公网IP和ECS.NAT网关.SLB的解耦,满足灵活管理的要求.
- leaving sockets open which can trigger a ResourceWarning in some # cases, and look like a memory leak in others
# -*- coding: utf-8 -*- """ requests.api ~~~~~~~~~~~~ This module implements the Requ ...
- 关于js中each()使用return不能终止循环
Jquery的each里面用return false代替break:return ture代替continue $(xx).each(function() { if(xx){ return false ...