HDU 5821 Ball(贪心)

原创 2016年08月30日 21:21:22

Description
给两个长度为n的序列a和b,m次操作,每次操作可以把a序列区间[l,r]中的数重排,问经过m次操作后a序列是否能够变成b序列
Input
第一行一整数T表示用例组数,每组用例首先输入两整数n和m分别表示序列长度和操作数,之后两行每行n个整数分别表示a序列和b序列,最后m行每行两个整数l,r表示该次操作可以操作的区间
(1<=n<=1000,0<=m<=1000,0<=ai,bi<=1000,1<=l<=r<=1000)
Output
对于每组用例,如果a序列经过m次操作变成b序列则输出Yes,否则输出No
Sample Input
5
4 1
0 0 1 1
0 1 1 1
1 4
4 1
0 0 1 1
0 0 2 2
1 4
4 2
1 0 0 0
0 0 0 1
1 3
3 4
4 2
1 0 0 0
0 0 0 1
3 4
1 3
5 2
1 1 2 2 0
2 2 1 1 0
1 3
2 4
Sample Output
No
No
Yes
No
Yes
Solution
对于a序列的每个值,找到其在b序列中应处的位置pos[i],那么每次操作我们贪心的让每个元素更加接近其应处的位置,说白了就是sort下pos[l]~pos[r],最后判断排序完的a序列是否与b序列相等即可
Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 1111
int T,n,m,b[maxn],vis[maxn];
pair<int,int>a[maxn];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&a[i].second);
        for(int i=1;i<=n;i++)scanf("%d",&b[i]);
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
        {
            a[i].first=-1;
            for(int j=1;j<=n;j++)
                if(b[j]==a[i].second&&!vis[j])
                {
                    a[i].first=j,vis[j]=1;
                    break;
                }
        }
        for(int i=1;i<=m;i++)
        {
            int l,r;
            scanf("%d%d",&l,&r);
            sort(a+l,a+r+1);
        }
        int flag=1;
        for(int i=1;i<=n;i++)
            if(a[i].second!=b[i])
            {
                flag=0;
                break;
            }
        printf("%s\n",flag?"Yes":"No"); 
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDU 5821 Ball 贪心+映射

题目链接:HDU5821 Ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/...

HDU 5821 Ball(贪心)

Ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub...
  • Yasola
  • Yasola
  • 2016年08月11日 19:18
  • 167

hdu5821 Ball 贪心

/* 题意:给定一个n个数的a序列,a[i]表示初始i位置的球的颜色是a[i],再给定一个b序列,b[i]表示希望最终i位置变成 b[i]颜色的球,现按照顺序给出m组(l , ...
  • jijijix
  • jijijix
  • 2016年10月21日 00:49
  • 79

【HDU5821】Ball(贪心)

题目大意: 给你一个a序列 和 b序列,问能否经过操作把a变成b。操作:取出l 到 r的数,可以以任意的顺序放回。 题解: 假设有4个红球,初始时从左到右标为1,2,3,4。那么肯定存在一种方案...

HDU 5821 Ball (贪心排序) -2016杭电多校联合第8场

题目链接:这里 题意:T组数据,每组给定一个n一个m,在给定两个长度为n的数组a和b,再给定m次操作,每次给定l和r,每次可以把[l,r]的数进行任意调换位置,问能否在转换后使得a数组变成b数组。 ...

2016多校8 hdu5821 Ball 智商题

Ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub...
  • kyoma
  • kyoma
  • 2016年08月13日 11:23
  • 225

HDU 5821 Ball 思路题

题意:有两行数字,现在想把第一行数字变成第二行数字,现在有m个区间,第一行所给的区间内的任意两个数字可以交换位置,可以交换很多次,问经过m个区间交换之后,第一行数字是否能变成第二行数字?...

hdu 5821 2016 Multi-University Training Contest 8 Ball 解题报告

题意: 给你n个盒子,每个盒子里可能有球或者没有,告诉你球的颜色,没有就是0,m次操作,每次操作可以把一个区间里的球都拿出来,重新放进去,问你m次操作后能不能到达目标状态   每个盒子最多放一个球 ...

hdu 5821 Ball 2016 Multi-University 8

给两个长度为 n 的数的序列 a 和 b,问 a 能不能在 m 次操作后变成 b 每次操作都是给个区间 [ l,r ],把此区间的所有数拿出来然后任意重排后放回去...

HDU 5821 Ball

2016多校赛第8场 贪心+排序
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 5821 Ball(贪心)
举报原因:
原因补充:

(最多只允许输入30个字)