HDU-5821 Ball(排序)

xiaoxiao2021-02-28  41

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5821点击打开链接

Ball

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1378    Accepted Submission(s): 781 Problem Description ZZX has a sequence of boxes numbered  1,2,...,n . Each box can contain at most one ball. You are given the initial configuration of the balls. For  1in , if the  i -th box is empty then  a[i]=0 , otherwise the i-th box contains exactly one ball, the color of which is a[i], a positive integer. Balls with the same color cannot be distinguished. He will perform m operations in order. At the i-th operation, he collects all the balls from boxes l[i],l[i]+1,...,r[i]-1,r[i], and then arbitrarily put them back to these boxes. (Note that each box should always contain at most one ball) He wants to change the configuration of the balls from a[1..n] to b[1..n] (given in the same format as a[1..n]), using these operations. Please tell him whether it is possible to achieve his goal.   Input First line contains an integer t. Then t testcases follow.  In each testcase: First line contains two integers n and m. Second line contains a[1],a[2],...,a[n]. Third line contains b[1],b[2],...,b[n]. Each of the next m lines contains two integers l[i],r[i]. 1<=n<=1000,0<=m<=1000, sum of n over all testcases <=2000, sum of m over all testcases <=2000. 0<=a[i],b[i]<=n. 1<=l[i]<=r[i]<=n.   Output For each testcase, print "Yes" or "No" in a line.   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   将b数组看做排序后的结果 然后每次操作就是对区间排序

如此一来便可以将a数组通过下标转化成乱序的数组 对每次操作进行桶排序 最后检验是否一致即可

注意构造下标时因为不会出现交叉情况 因此重复数字对其没有影响

这里因为数的范围时0~n 会少了离散操作

#include <iostream> #include <algorithm> #include <stdio.h> #include <set> using namespace std; int a[2222]; int b[2222]; int main() { int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++) scanf("%d",&b[i]); vector<int > pos[n+1]; int point[n+1]; int num[n+1]; int nmid=n+1; for(int i=0;i<=n;i++) point[i]=0; for(int i=0;i<n;i++) { pos[b[i]].push_back(i); } for(int i=0;i<=n;i++) num[i]=pos[i].size(); for(int i=0;i<n;i++) { if(point[a[i]]<num[a[i]]) { int mid=a[i]; a[i]=pos[a[i]][point[a[i]]]; point[mid]++; } else a[i]=nmid++; } for(int i=0;i<m;i++) { int l,r; scanf("%d%d",&l,&r); int tong[2222]; for(int i=0;i<2222;i++) tong[i]=0; for(int i=l-1;i<=r-1;i++) { tong[a[i]]++; } int cnt=0; while(!tong[cnt]) cnt++; for(int i=l-1;i<=r-1;i++) { a[i]=cnt; tong[cnt]--; while(!tong[cnt]) cnt++; } } int flag=0; for(int i=0;i<n;i++) if(a[i]!=i) { flag=1; } if(flag) cout << "No" << endl; else cout << "Yes" << endl; } }

转载请注明原文地址: https://www.6miu.com/read-2626209.html

最新回复(0)