2016多校联合训练#8
HDU 5821 Ball
贪心,想法题
传送门:HDU
题意
给AB两个等长序列,给几个区间。A序列区间内的部分可以随意重排,给了m个区间,一次重排后AB序列能不能想等?
思路
贪心吧。每次读B的数据时b[i],找这个数在A中出现的位置j。pos初始化为-1,然后a[j].pos=i,这个值就是a[j]最后应该被交换到的位置。每读取一个区间,对这个区间按pos值sort,小的排到前面。这样最后如果i==a[i].pos,就ok,否则no。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <iomanip>
#include <string>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int MAXN=100007;
typedef long long int ll;
struct AAA{
int data=0;
int fa=-1;
bool operator <(const AAA &b) const
{
return fa<b.fa;
}
}a[MAXN];
int b[MAXN];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int flag=0;
int n,m;
scanf("%d%d",&n,&m);
memset(a,-1,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
{
scanf("%d",&(a[i].data));
}
for(int i=0;i<n;i++)
{
scanf("%d",&(b[i]));
for(int j=0;j<n;j++)
{
if(a[j].data==b[i]&&a[j].fa==-1)
{
a[j].fa=i;
break;
}
if(j==n-1) flag=1;
}
}
int p,q;
while(m--)
{
scanf("%d%d",&p,&q);
p--;q--;
sort(a+p,a+q+1);
}
for(int i=0;i<n;i++)
{
if(i!=a[i].fa)
{
flag=1;
break;
}
}
if(flag) printf("No\n");
else printf("Yes\n");
}
}