多校赛第八场

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/readlnh/article/details/52190328

hdu 5821

题意

给定一列球,每种球有一个颜色,同一颜色的球无区别
每次选择一个区间,任意排列其中的球
问是否能从初始的排列变成给定的一个排列

思路

这题其实很水,就是一个简单的排序。。。比赛期间其实想到排序
,然而当时感觉把多余的往后排就好。。然而。。。其实这题因为操作是有顺序的,每次操作都要把位置定下来。而且,很重要的一点,颜色一样的都是没区别的。所以同样颜色的在前面位置的排列完后相对位置完全可以不变,那其实把a按b里面的位置作为关键字排序,然后最后对比一下位置就好了

代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

struct aa {
    int value;
    int id;
    bool operator < (const aa &x)const {
        return id < x.id;
    }
} a[1000 + 10];


int b[1000 + 10];

int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        int n,m;
        scanf("%d %d", &n, &m);
        memset(a, -1, sizeof(a));
        for(int i = 1; i <= n; i++)
            scanf("%d", &a[i].value);
        for(int i = 1; i <= n; i++) {
            scanf("%d", &b[i]);
            for(int j = 1; j <= n; j++) {
                if(a[j].value == b[i] && a[j].id == -1) {
                    a[j].id = i;
                    break;
                }
            }
        }
        while(m--) {
            int l,r;
            scanf("%d %d", &l, &r);
            sort(a + l, a + r + 1);
            //sort(b + l, b + r + 1);
        }
        bool flag = true;   
        for(int i = 1; i <= n; i++)
            if(a[i].value != b[i]) {
                flag = false;
                break;
            }
        if(flag)
            printf("Yes\n");
        else 
            printf("No\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/readlnh/article/details/52190328
今日推荐