zoukankan      html  css  js  c++  java
  • Croc Champ 2013

    题目链接:

    http://codeforces.com/problemset/problem/292/E

    E. Copying Data

    time limit per test2 seconds
    memory limit per test256 megabytes
    #### 问题描述 > 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

    题意

    给你大小为n的两个数组,a,b;
    执行两个操作:
    1,x,y,k,把a数组中以x开头长度为k的串覆盖到b数组中以y开头的长度为k的位置。
    2,x, 查询b[x];

    题解

    对于查询1在b数组上做成段覆盖更新:(y,y+k-1),值为查询的id。然后对于查询2做单点查询,查到对应的查询再去a数组中找对应的位置。

    代码

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<ctime>
    #include<vector>
    #include<cstdio>
    #include<string>
    #include<bitset>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<functional>
    using namespace std;
    #define X first
    #define Y second
    #define mkp make_pair
    #define lson (o<<1)
    #define rson ((o<<1)|1)
    #define mid (l+(r-l)/2)
    #define sz() size()
    #define pb(v) push_back(v)
    #define all(o) (o).begin(),(o).end()
    #define clr(a,v) memset(a,v,sizeof(a))
    #define bug(a) cout<<#a<<" = "<<a<<endl
    #define rep(i,a,b) for(int i=a;i<(b);i++)
    #define scf scanf
    #define prf printf
    
    typedef long long LL;
    typedef vector<int> VI;
    typedef pair<int,int> PII;
    typedef vector<pair<int,int> > VPII;
    
    const int INF=0x3f3f3f3f;
    const LL INFL=0x3f3f3f3f3f3f3f3fLL;
    const double eps=1e-8;
    const double PI = acos(-1.0);
    
    //start----------------------------------------------------------------------
    
    const int maxn=1e5+10;
    
    int setv[maxn<<2];
    
    void pushdown(int o){
        if(setv[o]!=-1){
            setv[lson]=setv[rson]=setv[o];
            setv[o]=-1;
        }
    }
    
    int qp,qv;
    void query(int o,int l,int r){
        if(l==r||setv[o]!=-1){
            qv=setv[o];
        }else{
            if(qp<=mid) query(lson,l,mid);
            else query(rson,mid+1,r);
        }
    }
    
    int ul,ur,uv;
    void update(int o,int l,int r){
        if(ul<=l&&r<=ur){
            setv[o]=uv;
        }else{
            pushdown(o);
            if(ul<=mid) update(lson,l,mid);
            if(ur>mid) update(rson,mid+1,r);
        }
    }
    
    struct Node{
        int x,y,k;
        Node(int x,int y,int k):x(x),y(y),k(k){}
        Node(){}
    }que[maxn];
    
    int a[maxn],b[maxn];
    int n,m;
    
    void init(){
        clr(setv,-1);
    }
    
    int main() {
        scf("%d%d",&n,&m);
        init();
        for(int i=1;i<=n;i++) scf("%d",&a[i]);
        for(int i=1;i<=n;i++) scf("%d",&b[i]);
    
        ul=1,ur=n,uv=0;
        update(1,1,n);
    
        for(int i=1;i<=m;i++){
            int cmd; scf("%d",&cmd);
            if(cmd==1){
                int x,y,k;
                scf("%d%d%d",&x,&y,&k);
                que[i]=Node(x,y,k);
    
                ul=y,ur=y+k-1,uv=i;
                update(1,1,n);
            }else{
                int x; scf("%d",&x);
    
                qp=x;
                query(1,1,n);
    
                int ans;
                if(qv==0) ans=b[x];
                else ans=a[x-que[qv].y+que[qv].x];
                prf("%d
    ",ans);
    
            }
        }
        return 0;
    }
    
    //end-----------------------------------------------------------------------
  • 相关阅读:
    预定义规则 取范围数据
    oracle table 数组的赋值方法
    java 缓存读写
    webpack
    vscode setting
    webpack babel
    共享你的vscode配置
    github API很丰富
    tips
    todo
  • 原文地址:https://www.cnblogs.com/fenice/p/5874587.html
Copyright © 2011-2022 走看看