HDU5821之映射

来源:互联网 发布:数据库推荐书籍 编辑:程序博客网 时间:2024/05/16 09:52

题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5821

题意:给我们一个初始序列和目标序列,然后给m次操作,每次操作能修改从l到r的球的位置,问m次操作后能否得到最终序列。

我们可以先将目标序列每个数的出现顺序和初始序列做一个映射,然后对于每次操作,在操作区间内排序,看最后得到的序列是否是1到n就可以了。

代码:

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>const int MAXN=1024;using namespace std;int a[MAXN],b[MAXN];int l[MAXN],r[MAXN];bool vis[MAXN];using namespace std;void solve(){    int n,m;    memset(vis,true,sizeof(vis));    scanf("%d %d",&n,&m);    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);    }    for(int i=1;i<=n;i++)    {        scanf("%d",&b[i]);    }    for(int i=1;i<=m;i++)    {        scanf("%d %d",&l[i],&r[i]);    }    for(int i=1;i<=n;i++)    {        bool is=false;        for(int j=1;j<=n;j++)        {            if(a[i]==b[j]&&vis[j])            {                a[i]=j;                vis[j]=false;                is=true;                break;            }        }        if(!is)        {            puts("No");//如果匹配不到,则一定不行            return ;        }    }    for(int i=1;i<=m;i++)    {        sort(a+l[i],a+r[i]+1);    }    int fl=0;    for(int i=1;i<=n;i++)    {        if(a[i]!=i)        {            fl=1;            puts("No");            return ;        }    }    if(!fl)    {        puts("Yes");        return ;    }    return ;}int main (void){    int t;    cin>>t;    while(t--)    {        solve();    }    return 0;}
0 0
原创粉丝点击