• Codeforces 292E


    题目大意:

    给定两个长度为n(1~10^5)的数组a[]和数组b[],有两个操作。

    1: 1 x y k,令b[y+q]=a[x+q] (0<=q<k)

    2: 2 x, 问当前的b[x]的值。

    最多操作次数m为10^5.

    区间更新,单点查询。

    AC Code
     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 #define lson l,m,rt<<1
     5 #define rson m+1,r,rt<<1|1
     6 #define maxn 100001
     7 int a[maxn],b[maxn];
     8 struct node{
     9     int cnt,y;
    10 }setree[maxn<<2];
    11 void build(int l,int r,int rt)
    12 {
    13     setree[rt].cnt=0;
    14     setree[rt].y=0;
    15     if(l==r)
    16     return;
    17     int m=(l+r)>>1;
    18     build(lson);
    19     build(rson);
    20 }
    21 void pushdown(int rt)
    22 {
    23     if(setree[rt].cnt){
    24         setree[rt<<1].y=setree[rt].y;
    25         setree[rt<<1].cnt=setree[rt].cnt;
    26         setree[rt<<1|1].y=setree[rt].y;
    27         setree[rt<<1|1].cnt=setree[rt].cnt;
    28         setree[rt].y=0;
    29         setree[rt].cnt=0;
    30     }
    31 }
    32 void update(int l,int r,int rt,int L,int R,int c)
    33 {
    34     if(L<=l&&r<=R){
    35         setree[rt].y=L;
    36         setree[rt].cnt=c;
    37         return;
    38     }
    39     int m=(l+r)>>1;
    40     pushdown(rt);
    41     if(L<=m)
    42     update(lson,L,R,c);
    43     if(R>m)
    44     update(rson,L,R,c);
    45 }
    46 int query(int l,int r,int rt,int num)
    47 {
    48     if(l==r){
    49         if(setree[rt].cnt==0)
    50         return 0;
    51         return setree[rt].cnt+num-setree[rt].y;
    52     }
    53     int m=(l+r)>>1;
    54     pushdown(rt);
    55     if(num<=m)
    56     return query(lson,num);
    57     else
    58     return query(rson,num);
    59 }
    60 int main()
    61 {
    62     int n,m;
    63     scanf("%d%d",&n,&m);
    64     for(int i=1;i<=n;i++)
    65     scanf("%d",a+i);
    66     for(int i=1;i<=n;i++)
    67     scanf("%d",b+i);
    68     build(1,n,1);
    69     while(m--){
    70         int op;
    71         scanf("%d",&op);
    72         if(op==1){
    73             int x,y,k;
    74             scanf("%d%d%d",&x,&y,&k);
    75             update(1,n,1,y,y+k-1,x);
    76         }
    77         else{
    78             int num;
    79             scanf("%d",&num);
    80             int ans=query(1,n,1,num);
    81             if(ans==0)
    82             printf("%d\n",b[num]);
    83             else
    84             printf("%d\n",a[ans]);
    85         }
    86     }
    87 }
  • 相关阅读:
    分享
    慕课网-软件测试基础-学习笔记
    向量内积(点乘)和外积(叉乘)概念及几何意义
    使用opencv3+python实现视频运动目标检测
    解决opencv3运行opencv2代码时报错的修改备忘录
    分享
    OpenCV学习笔记
    LeetCode
    LeetCode
    npm安装包很慢
  • 原文地址:https://www.cnblogs.com/kim888168/p/3049046.html
Copyright © 2020-2023  润新知