zoukankan      html  css  js  c++  java
  • 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
    ",at(i).d);
    }
    
  • 相关阅读:
    mybatis中#{}和${}的区别 (二)
    JAVA分布式架构的演变及解决方案
    mybatis中的#和$的区别
    https
    vue3的组件v-model初探1
    前端性能优化
    HTTP请求的完全过程
    http缓存详解,http缓存推荐方案
    vscode-setting备份
    Mac电脑在finder中添加- 右键打开vscode
  • 原文地址:https://www.cnblogs.com/f321dd/p/5608242.html
Copyright © 2011-2022 走看看