BZOJ4620: [Wf2016]What Really Happened on Mars?

题意比较难懂?反正我为此特地查了优先级倒置和优先级置顶协议是什么。

读懂题以后就好办了,直接模拟即可。

由于数据范围较小,写得比较暴力,应该还有很大优化空间。

#include<cstdio>
int clk,n,m,f[21],q[21];
struct node;
node*top;
void build();
node*find_top();
int id(node*);
node&at(int);
void max_eq(int&s,int t){
	if(s<t)
		s=t;
}
struct node{
	char s[100][8];
	int a,b,c,d,k,t,v[100];
	bool r,l;
	void scan(){
		scanf("%d%d%d",&t,&b,&a);
		for(int i=0;i!=a;++i){
			scanf("%s",s[i]);
			sscanf(s[i]+1,"%d",v+i);
			if(*s[i]==76)
				max_eq(q[v[i]],b);
		}
	}
	bool test(int i){
		return*s[k]==76&&(v[k]==i||c<=q[i]);
	}
	void run(){
		c=b;
		for(int i=1;i<=n;++i)
			if(at(i).r&&!at(i).d)
				for(int j=1;j<=m;++j)
					if(f[j]==i&&test(j)){
						l=1;
						max_eq(at(i).c,c);
					}
		r=1;
	}
	void next(){
		if(*s[k]==76)
			f[v[k]]=id(this);
		if(*s[k]==85){
			f[v[k]]=0;
			c=b;
			for(int j=1;j<=m;++j)
				if(f[j]==id(this))
					for(int i=1;i<=n;++i)
						if(i!=id(this)&&at(i).r&&!at(i).d&&at(i).test(j))
							max_eq(c,at(i).c);
		}
		if((k+=*s[k]!=67||++clk&&!--v[k])==a)
			d=clk;
	}
}task[21];
int id(node*p){
	return p-task;
}
node&at(int i){
	return task[i];
}
void build(){
	for(int i=1;i<=n;++i)
		if(at(i).r&&!at(i).d){
			at(i).l=0;
			for(int j=1;j<=m;++j)
				at(i).l|=f[j]&&f[j]!=i&&at(i).test(j);
		}
}
node*find_top(){
	top=0;
	for(int i=1;i<=n;++i)
		if(at(i).r&&!at(i).d&&!at(i).l&&(!top||at(i).c>top->c))
			top=&at(i);
	return top;
}
bool ended(){
	for(int i=1;i<=n;++i)
		if(!at(i).d)
			return 0;
	return 1;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		at(i).scan();
	while(!ended()){
		for(int i=1;i<=n;++i)
			if(!at(i).r&&at(i).t==clk)
				at(i).run();
		build();
		if(find_top()||!++clk)
			top->next();
	}
	for(int i=1;i<=n;++i)
		printf("%d\n",at(i).d);
}
posted @ 2016-06-22 19:09  f321dd  阅读(326)  评论(0编辑  收藏  举报