题意:长度为 n 的数组 a[] ,有两个操作: 1、区间 [l,r] 的数向右移,即 a[i+1] 变为 a[i],a[l] 变为 a[r] 。 2、反转区间 [l,r] 。 最后有 m 个询问 q,输出最后得到的数组里 a[q] 的值。
tags: 一开始觉得是什么数据结构,发现 m <= 100,这样就直接暴力,对于每个询问从后往前反过来操作一遍。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 200005; int n, q, m, a[N], t[N], l[N], r[N]; int main() { scanf("%d%d%d", &n, &q, &m); rep(i,1,n) scanf("%d", &a[i]); rep(i,1,q) scanf("%d%d%d", &t[i], &l[i], &r[i]); int bi; rep(j,1,m) { scanf("%d", &bi); per(i,q,1) { if(l[i]<=bi && bi<=r[i]) { if(t[i]==1) { bi = (bi==l[i]) ? r[i] : bi-1; } else { bi = l[i]+(r[i]-bi); } } } printf("%d ", a[bi]); } return 0; }