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);
}

浙公网安备 33010602011771号