2214: Sequence Magic
Description有一个1到N的自然数序列1,2,3,…,N-1,N。
我们对它进行M次操作,每次操作将其中连续的一段区间 [Ai,Bi]
(即第Ai个元素到第Bi个元素之间的一段)取出,然后插入到剩下的第Ci个元素的后面,如果Ci=0,表示插入到最左端。
现在,M次操作完后,有K个询问,每个询问Pi表示询问最终第Pi个元素是几。你的任务是写一个程序,依次回答这K个询问。
Input
第一行三个数,N,M,K。
接下来M行,每行三个整数Ai,Bi,Ci。
接下来K行,每行一个正整数Pi。
1<=N<=1e9,1<=M<=1e4,1<=K<=1000,1<=Ai<=Bi<=N,0<=Ci<=N-(Bi-Ai+1),1<=Pi<=N;
Output
输出共K行,为每次询问的答案。
Sample Input
Sample Output13 3 13
6 12 1
2 9 0
10 13 8
1
2
3
4
5
6
7
8
9
10
11
12
13
Hint6
7
8
9
10
11
12
2
3
4
5
13
1
把变换前后的情况列举出来,再倒推回去即可。注意讨论两种情况
#include<stdio.h>
#define MAXN 10005
int n, m, k;
int a[MAXN], b[MAXN], c[MAXN];
int p;
int main()
{
while (scanf("%d%d%d", &n, &m, &k) != EOF)
{
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &a[i], &b[i], &c[i]);
}
while (k--)
{
scanf("%d", &p);
for (int i = m - 1; i >= 0; i--)
{
if ((p <= a[i] - 1 && p <= c[i]) || (p >= b[i] + 1 && p >= c[i] + b[i] - a[i] + 2))
continue;
if(c[i]<a[i])
{
if (c[i] + 1 <= p && p <= c[i] + b[i] - a[i] + 1)
{
p = p - c[i] - 1 + a[i];
}
else if (c[i] + b[i] - a[i] + 2 <= p && p <= b[i])
{
p = p + a[i] - b[i] - 1;
}
}
if(c[i]>=a[i])
{
if (a[i] <= p && p <= c[i])
{
p = p - a[i] + b[i] + 1;
}
else if (c[i] + 1 <= p && p <= c[i] + 1 + b[i] - a[i])
{
p = p - c[i] - 1 + a[i];
}
}
}
printf("%d\n", p);
}
}
return 0;
}
/**********************************************************************
Problem: 2214
User: irontonystark
Language: C
Result: AC
Time:220 ms
Memory:1236 kb
**********************************************************************/