hdoj5821【贪心-神题】

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,比赛的时候直接读错题了,实力带坑队友。。。。
题意:
有两个序列都代表筐,每个筐里只有一个球,然后序列的值代表筐里的球的颜色,问你在m次操作后,a序列的球能否变成b序列的球,每总操作虽然是收集这个区间所有的球,但是每个筐只能放一个,也就是说这只是交换位置的操作。
思路:
补完题,也完全想不出可以用标记下标,然后对m个区间的a数组下标排序,因为在排序的过程中,就会类似于偏移操作,而且是最优操作哦,然后判断一下就好了。哎,实在想不出来,好厉害的方法,+神题;
挫code……

#include<cstdio>
#include<iostream>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define eps 1e-8
typedef __int64 LL;

const int N=1e3+10;

struct asd{
    int id;
    int v;
}q[N];
int temp[N];

bool cmp(asd x,asd y)
{
    return x.id<y.id;
}

int main()
{
    int t;
    int n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&q[i].v);
            q[i].id=-1;
        }
        for(int i=0;i<n;i++)
        {
            scanf("%d",&temp[i]);
            for(int j=0;j<n;j++)
            {
                if(q[j].v==temp[i]&&q[j].id==-1)
                {
                    q[j].id=i;
                    break;
                }
            }
        }
        int s,t;
        while(m--)
        {
            scanf("%d%d",&s,&t);
            sort(q+s-1,q+t,cmp);
        }
        bool flag=true;
        for(int i=0;i<n;i++)
        {
            if(q[i].v!=temp[i])
            {
                flag=false;
                break;
            }
        }
        if(flag) puts("Yes");
        else puts("No");
    }
    return 0;
}
/*

100
4 1
1 1 0 0
0 0 0 2
1 4
4 2
1 1 0 0
0 0 0 2
1 4
2 4
*/
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934892.html