标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5821
题意:有n个盒子,每个盒子又一个值 a[i] 如果 a[i] 大于 0 说明盒子里面有 1 个颜色为 a[i] 的球,如果 = 0 说明里面,没有球;
现在有m个操作,每次操作都是从盒子[L, R]内拿走所有的球,然后随机放入[L, R]的盒子中,问经过m次操作之后是否能达到b序列的状态;
我们可以把b序列的每个数当做 1 2 3 4 5 6 ... n 按顺序排好的n个数;那么a序列就是123456...n这些的的乱序,问经过m次的排序是否能达到有序的状态;
所以我们可以把a序列转化为t
例如
a : 1 1 2 2 0
b : 2 2 1 1 0
b相当于1 2 3 4 5
t : 3 4 1 2 5
t[i]意思就是a[i]在b中出现的相应位置;
然后排序即可;
水题可是想不到就变成了难题啊
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; #define INF 0xfffffff #define N 1050 typedef long long LL; int main() { int T, a[N], b[N], t[N]; scanf("%d", &T); while(T--) { memset(t, -1, sizeof(t)); int n, m; scanf("%d %d", &n, &m); for(int i=1; i<=n; i++) scanf("%d", &a[i]); int cnt = 1; for(int i=1; i<=n; i++) { scanf("%d", &b[i]); for(int j=1; j<=n; j++) { if(t[j] == -1 && a[j] == b[i]) { t[j] = cnt++; break; } } } for(int i=1; i<=m; i++) { int L, R; scanf("%d %d", &L, &R); sort(t+L, t+R+1); } int flag = 0; for(int i=1; i<=n; i++) { if(t[i] != i) { flag = 1; break; } } if(flag) puts("No"); else puts("Yes"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zhengguiping--9876/p/5763141.html