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