【Codeforces】CF982B-Bus of Characters(优先队列)

题目链接:https://codeforces.com/problemset/problem/982/B

题目大意

给定 2 × n 2 \times n 2×n的座位,每一列的两个记为一排,每排有权重w1 ,w2 ,…,wn ,保证互不相同,有两类人依次来乘车:

  • 内向的人:只坐无人的一排,如果有多排,挑权重小的坐
  • 外向的人:只坐有一个人的一排,如果有多排,挑权重大的坐

给定权重,人数和来人的次序,求落座的情况。

解法

优先队列维护候选集,c数组维护全局每排人数情况。

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define pb push_back

using namespace std;
typedef long long LL;
const int N=200000+5;
int n;
char s[N*2];
struct Node1{
	int w,id;
	bool operator < (const Node1 &b)const{
		return w>b.w;
	}
};
priority_queue<Node1> q1;

struct Node2{
	int w,id;
	bool operator <(const Node2 &b)const{
		return w<b.w;
	}
};
priority_queue<Node2> q2;
int c[N];
int main() {

#ifdef LOCAL_DEFINE
	freopen("input.in", "rt", stdin);
#endif
	scanf("%d",&n);
	Node1 cur1;
	Node2 cur2;
	for1(i,n) {
		scanf("%d",&cur1.w);
		c[i]=0;
		cur1.id=i;
		q1.push(cur1);
	//	q2.push(cur2);
	}
	scanf("%s",s);
	forn(i,2*n){
	//	cout<
		if(s[i]=='0'){
			while(!q1.empty()){
				cur1=q1.top();q1.pop();
				if(c[cur1.id]==0){
					c[cur1.id]=1;
					cur2.id=cur1.id;
					cur2.w=cur1.w;
					q2.push(cur2);
					printf("%d ",cur1.id);
					break;
				}
			}
		}
		else{
			while(!q2.empty()){
				cur2=q2.top();q2.pop();
				if(c[cur2.id]==1){
					c[cur2.id]=2;
					printf("%d ",cur2.id);
					break;
				}
			//	if(c[cur2.id]==0) q2.push(cur2);
			}
		}
	}
	printf("\n");
#ifdef LOCAL_DEFINE
	cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
	return 0;
}


你可能感兴趣的:(算法与数据结构)