1. 程式人生 > >CSU 2018年12月月賽 B 2214: Sequence Magic

CSU 2018年12月月賽 B 2214: Sequence Magic

Description

有一個1到N的自然數序列1,2,3,...,N-1,N。

我們對它進行M次操作,每次操作將其中連續的一段區間 [Ai,Bi][Ai,Bi] (即第Ai個元素到第Bi個元素之間的一段)取出,然後插入到剩下的第Ci個元素的後面,如果Ci=0,表示插入到最左端。

現在,M次操作完後,有K個詢問,每個詢問Pi表示詢問最終第Pi個元素是幾。你的任務是寫一個程式,依次回答這K個詢問。

Input

第一行三個數,N,M,K。

接下來M行,每行三個整數Ai,Bi,Ci。

接下來K行,每行一個正整數Pi。

1<=N<=109,1<=M<=104,1<=K<=1000,1<=Ai<=Bi<=N,0<=Ci<=N-(Bi-Ai+1),1<=Pi<=N;

Output

輸出共K行,為每次詢問的答案。

Sample Input

13 3 13 
6 12 1 
2 9 0 
10 13 8 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13


Sample Output

6 
7 
8 
9 
10 
11 
12
2 
3 
4 
5 
13 
1 

題解:經典思路,先離線下來,然後倒推。
#include <iostream>
#include <cstring>
#include <cstdio>
#include 
<algorithm> #include <math.h> #include <set> using namespace std; const int maxn=10005; int n,m,k,x; //map<int,int>ma; int a[maxn],b[maxn],c[maxn]; int main() { scanf("%d %d %d",&n,&m,&k); // for(int i=1;i<=n;i++) // ma[i]=i; for(int i=1;i<=m;i++) scanf(
"%d %d %d",&a[i],&b[i],&c[i]); while(k--) { scanf("%d",&x); for(int i=m;i>0;i--) { int t=b[i]-a[i]+1; if(x>=(min(c[i]+1,a[i]))&&x<=(max(c[i]+t,b[i]))) { if(x<=c[i]) x+=t; else if(x>c[i]+t) x-=t; else x+=(a[i]-c[i]-1); } } printf("%d\n",x); } return 0; } /********************************************************************** Problem: 2214 User: therang Language: C++ Result: AC Time:180 ms Memory:2140 kb **********************************************************************/