赞
踩
题目链接:点击查看
题目大意:给出一个长度为 n n n 的数列,每个数字有一个颜色,如果是蓝色,每次操作则可以减一;如果是红色,每次操作则可以加一。
问有限次操作后,能否将数组变为一个长度为 n n n 的排列。
题目分析:第一次做的时候用 multiset 乱搞过了,但感觉不算正解,看了题解后发现这不就是一个经典的贪心套路:区间和数字的最大匹配问题。
先将区间按左端点排序,再将数字从小到大排序,然后用优先队列控制区间右端点是否过期就可以了。
代码:
// Problem: D. Blue-Red Permutation // Contest: Codeforces - Codeforces Round #753 (Div. 3) // URL: https://codeforces.com/contest/1607/problem/D // Memory Limit: 256 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org) // #pragma GCC optimize(2) // #pragma GCC optimize("Ofast","inline","-ffast-math") // #pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #include<list> #include<unordered_map> #define lowbit(x) (x&-x) using namespace std; typedef long long LL; typedef unsigned long long ull; template<typename T> inline void read(T &x) { T f=1;x=0; char ch=getchar(); while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); x*=f; } template<typename T> inline void write(T x) { if(x<0){x=~(x-1);putchar('-');} if(x>9)write(x/10); putchar(x%10+'0'); } const int inf=0x3f3f3f3f; const int N=1e6+100; struct Node { int l,r; bool operator<(const Node& t)const {return r>t.r;} }node[N]; int a[N]; char s[N]; int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false); int w; cin>>w; while(w--) { int n; read(n); for(int i=1;i<=n;i++) read(a[i]); scanf("%s",s+1); for(int i=1;i<=n;i++) { if(s[i]=='B') node[i]={1,a[i]}; else node[i]={a[i],n}; } sort(node+1,node+1+n,[&](Node a,Node b) {return a.l<b.l;}); bool flag=true; priority_queue<Node>q; int p=1; for(int i=1;i<=n;i++) { while(p<=n&&node[p].l<=i) q.push(node[p++]); int can=false; while(q.size()) { Node cur=q.top(); q.pop(); if(cur.r>=i) { can=true; break; } } flag&=can; } puts(flag?"YES":"NO"); } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。