1. 程式人生 > >863D - Yet Another Array Queries Problem(思維)

863D - Yet Another Array Queries Problem(思維)

for space std 答案 ostream sca set struct 思維

原題連接:http://codeforces.com/problemset/problem/863/D

題意:對a數列有兩種操作:

1 l r ,[l, r] 區間的數字滾動,即a[i+1]=a[i], a[l]=a[r]

2 l r ,[l, r] 區間的數字位置反轉。

若幹個操作之後輸出a[b[i]].

思路:

由於是在操作結束後輸出,且b[i]的個數不多(<=100),所以可以通過反推求出答案。

AC代碼:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using
namespace std; 5 typedef long long LL; 6 const int MAXN = 2e5+10; 7 struct Query { 8 int type; 9 int l,r; 10 }Q[MAXN]; 11 int a[MAXN]; 12 int n, q, m; 13 void print(int b) 14 { 15 for (int i = 1;i <= q;i++) { 16 if (b >= Q[i].l&&b <= Q[i].r) { 17 if
(Q[i].type == 1) { 18 b--; 19 if (b < Q[i].l) 20 b = Q[i].r; 21 } 22 else 23 b = Q[i].r - (b - Q[i].l); 24 } 25 } 26 printf("%d", a[b]); 27 return; 28 } 29 int main() { 30 31 scanf("
%d %d %d", &n, &q, &m); 32 for (int i = 1;i <= n;i++) { 33 scanf("%d", &a[i]); 34 } 35 for (int i = q;i >= 1;i--) { 36 scanf("%d %d %d", &Q[i].type, &Q[i].l, &Q[i].r); 37 } 38 int b; 39 for (int i = 0;i < m;i++) { 40 scanf("%d", &b); 41 if (i != 0) printf(" "); 42 print(b); 43 } 44 printf("\n"); 45 return 0; 46 }

863D - Yet Another Array Queries Problem(思維)