zoukankan      html  css  js  c++  java
  • Yet Another Array Queries Problem CodeForces

    You are given an array a of size n, and q queries to it. There are queries of two types:

    • li ri — perform a cyclic shift of the segment [li, ri] to the right. That is, for every x such that li ≤ x < ri new value of ax + 1 becomes equal to old value of ax, and new value of alibecomes equal to old value of ari;
    • li ri — reverse the segment [li, ri].

    There are m important indices in the array b1b2, ..., bm. For each i such that 1 ≤ i ≤ m you have to output the number that will have index bi in the array after all queries are performed.

    Input

    The first line contains three integer numbers nq and m (1 ≤ n, q ≤ 2·1051 ≤ m ≤ 100).

    The second line contains n integer numbers a1a2, ..., an (1 ≤ ai ≤ 109).

    Then q lines follow. i-th of them contains three integer numbers tiliri, where ti is the type of i-th query, and [li, ri] is the segment where this query is performed (1 ≤ ti ≤ 2, 1 ≤ li ≤ ri ≤ n).

    The last line contains m integer numbers b1b2, ..., bm (1 ≤ bi ≤ n) — important indices of the array.

    Output

    Print m numbers, i-th of which is equal to the number at index bi after all queries are done.

    Example

    Input
    6 3 5
    1 2 3 4 5 6
    2 1 3
    2 3 6
    1 1 6
    2 2 1 5 3
    Output
    3 3 1 5 2 

    题意:
    对一个数组,有两种操作,1:翻转 2 左移
    问所有操作完成后,位置p的数是多大.
    思路:
    对于当前操作,之后的操作与之无关,所以直接暴力反推,p由哪个位置转移来即可
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<map>
    #include<set>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<ctime>
    
    #define fuck(x) cerr<<#x<<" = "<<x<<endl;
    #define debug(a, x) cerr<<#a<<"["<<x<<"] = "<<a[x]<<endl;
    #define ls (t<<1)
    #define rs ((t<<1)|1)
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int loveisblue = 486;
    const int maxn = 200086;
    const int maxm = 100086;
    const int inf = 0x3f3f3f3f;
    const ll Inf = 999999999999999999;
    const int mod = 1000000007;
    const double eps = 1e-6;
    const double pi = acos(-1);
    
    int num[maxn];
    struct node{
        int l,r,type;
    }a[maxn];
    int main() {
    //    ios::sync_with_stdio(false);
    //    freopen("in.txt", "r", stdin);
    
        int n,q,m;
        scanf("%d%d%d",&n,&q,&m);
        for(int i=1;i<=n;i++){
            scanf("%d",&num[i]);
        }
        for(int i=1;i<=q;i++){
            scanf("%d%d%d",&a[i].type,&a[i].l,&a[i].r);
        }
    
        while (m--){
            int x;
            scanf("%d",&x);
            for(int i=q;i>=1;i--){
                if(a[i].l>x||a[i].r<x){ continue;}
                if(a[i].type==1){
                    if(a[i].l==x){
                        x=a[i].r;
                    }else {
                        x--;
                    }
                }else{
                    int y = a[i].r - x;
                    x = a[i].l+y;
                }
            }
            printf("%d ",num[x]);
        }
    
    
        return 0;
    }
    View Code
  • 相关阅读:
    读书笔记----软件设计原则、设计模式
    程伟杰 | 2021软件代码开发技术作业一 | 自我介绍+课程6问
    团队作业3-需求改进&系统设计
    团队项目作业2-需求规格说明书
    【Android实习】20场面试斩获大厂offer,我学会了什么
    通俗易懂,android是如何管理内存的
    关于Handler同步屏障你可能不知道的问题
    清晰图解深度分析HTTPS原理
    这一篇TCP总结请收下
    深入浅出Java线程池:源码篇
  • 原文地址:https://www.cnblogs.com/ZGQblogs/p/11317322.html
Copyright © 2011-2022 走看看