Ball---hdu5821(排序)

题目链接: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;
}
View Code
原文地址:https://www.cnblogs.com/zhengguiping--9876/p/5763141.html