您的位置:首页 > 运维架构

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: