CSU 2018年12月月賽 B 2214: Sequence Magic
阿新 • • 發佈:2018-12-23
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
**********************************************************************/