wxyww

一个OIER

我们要有最朴素的生活,与最遥远的梦想。即使明日天寒地冻,路远马亡。


CF1248E Queue in the Train

题目链接

problem

火车上的一列人要去排队接水。每个人都会在某个特定的时刻口渴。口渴之后他要去排队接水,如果他前面的座位有人已经在排队或者正在接水,那么他就不会去排队。否则他就会去排队。每个人接水都为一个相同的时间P。问每个人接完水的时间。

solution

其实模拟即可。注意题目的要求。如果一个人口渴的时候已经在排队的人中最靠前的位置也在他后面,那么他就要去排队。否则就把他扔到一个按位置从小到大排序的优先队列里面。然后模拟就行了。

code

#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<ctime>
#include<set>
using namespace std;
typedef long long ll;
const int N = 100010;
ll read() {
	ll x = 0,f = 1;char c = getchar();
	while(c < '0' || c > '9') {
		if(c == '-') f = -1;c = getchar();
	}
	while(c >= '0' && c <= '9') {
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}
struct node {
	int pos,w;
}a[N];
bool operator < (const node &A,const node &B) {
	return A.pos > B.pos;
}
priority_queue<node>q;
bool cmp(const node &A,const node &B) {
	return A.w == B.w ? A.pos < B.pos : A.w < B.w;
}
set<int>s;
ll ans[N];
queue<node>tq;
int main() {
	int n = read(),P = read();
	for(int i = 1;i <= n;++i) {
		a[i].pos = i;a[i].w = read();
	}
	
	sort(a + 1,a + n + 1,cmp);
	
	int p = 1;
	ll now = a[1].w;
	s.insert(n + 1);
	while(p <= n || !tq.empty() || !q.empty()) {
		if(!tq.empty()) {
			node k = tq.front();tq.pop();
			now += P;
			ans[k.pos] = now;
			
			while(p <= n && a[p].w < now) {
				if(a[p].pos < *s.begin()) {
					s.insert(a[p].pos);
					tq.push(a[p++]);
				}
				else {
					q.push(a[p++]);
				}
			}
			s.erase(k.pos);
		}
		
		
		if(tq.empty() && q.empty()) 
			now = max(now,(ll)a[p].w);
		
		while(p <= n && a[p].w <= now) q.push(a[p++]);
		int t = *s.begin();
		if(!q.empty() && q.top().pos <= t); {

			tq.push(q.top());
			s.insert(q.top().pos);
			q.pop();
		}
	}
	
	for(int i = 1;i <= n;++i) printf("%I64d ",ans[i]);
	return 0;
}
最近的文章

CF1248F Catowice City

题目链接problem有$n$个人,每个人家有一只猫。每个人都认识一些猫(其中肯定包括自己家的猫)。选出$j$个人和$k$只猫$j,k\ge 1$。使得$j+k=n$且选出的人和猫都互不认识。solution一个显然但是重要的推论是: 每个人家都必须去一个人或者一只猫。这样我们只需要枚举第一个人家去的是人还是猫,就可以根据他们之间的关系推出其他的人家是人还是猫。当无论第一家选择人还是选择猫,都会导致去$n$只猫或者$n$个人时无解。code#include<cstdio>#i...…

二分图染色继续阅读
更早的文章

CF1244F Chips

题目链接problem有一个长度为$n$个点连成的环。每个点为黑色或白色。当一个点和与他相邻的两个点颜色不同时。该点的颜色就会改变。问改变$K$次后每个点的颜色。solution发现两个性质:1.发现如果一个点在第一次时就不需要改变。那么他以后都不需要改变。2.如果有个点在某次不需要改变,那么下一次他相邻的两个点也一定不需要改变。所有思路就很明显了。从不需要改变的点开始$bfs$。得到每个点最早不需要改变的时间。然后与$K$取$min$后计算出最终颜色就行了。code#include<...…

思维题继续阅读