记录编号 334827 评测结果 AAAAAAAAAA
题目名称 [HZOI 2016]MC之旅:逃离基友 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 0.503 s
提交时间 2016-11-01 17:54:01 内存使用 0.72 MiB
显示代码纯文本
#include<cstdio> 
#include<vector>
#include<stack>
#include<cstring>
#define file(x) "T3_."#x
const int V=10010<<2;
std::vector<int> to[V];
std::stack<int> s;
int n,m;
bool be[V];
void add(int x,int y){
	int f1=1,f2=1;
	if(x<0) x=-x,f1=0;
	if(y<0) y=-y,f2=0;
	x<<=1,y<<=1;
	to[x+f1].push_back(y+f2);
}
void addxor(int x,int y){
	add(x,-y),add(-x,y),add(y,-x),add(-y,x);
}
void addor(int x,int y){
	add(-x,y);add(-y,x);
}
bool set(int x,bool val){
	//x<<=1;
	if(val) add(-x,x);
	else add(x,-x);
	return true;
	/*x+=val;
	if(be[x^1]) return false;
	else return be[x]=1;*/ 
}
bool dfs(int u){
	if(be[u]) return 1;
	else if(be[u^1]) return 0;
	s.push(u);
	be[u]=1;
	for(int i=0;i<to[u].size();i++) if(!dfs(to[u][i])) return false;
	return true;
}
bool check(){
	for(int i=2;i<=(n<<1)+1;i+=2){
		if(be[i]||be[i^1]) continue;
		while(!s.empty()) s.pop();
		if(!dfs(i^1)){
			while(!s.empty()) be[s.top()]=0,s.pop();
			if(!dfs(i)) return false;
		}
	}
	return true;
}
int solve(){
	for(int i=2;i<=(n<<1)+1;i++) to[i].clear();
	memset(be,0,sizeof(be));
	int ok=scanf("%d%d",&n,&m);
	if(ok!=2) return -1;
	n<<=1;
	bool fd=0;
	for(int i=1;i<=n;i+=2) addor(i,i+1),add(i,-(i+1)),add(i+1,-i);
	for(int i=1;i<=m;i++){
		int t;scanf("%d",&t);
		int x,y;
		switch(t){
			case 1:case 2:
				scanf("%d",&x);
				if(!set(x,(t-1)^1)) fd=1;
				break;
			default:
				scanf("%d%d",&x,&y);
				switch(t){
					case 3:if(!(set(x,1)&&set(y,1))) fd=1;break;
					case 4:if(!(set(x,1)&&set(y,0))) fd=1;break;
					case 5:addor(x,y);break;
					case 6:addor(x,-y);break;
					case 7:addor(-x,-y);break;
					case 8:if(!(set(x,0)&&set(y,0))) fd=1;break;
					case 9:addxor(x,y);break;
					case 10:add(x,y),add(-x,-y);add(y,x);add(-y,-x);break;
					case 11:addxor(x,-y);break;
					case 12:addor(-x,-y);break;
				}
				break;
		}
	}
	if(fd) return 0;
	return check();
}
int main(){
	freopen(file(in),"r",stdin);
	freopen(file(out),"w",stdout);
	int r;
	while((r=solve())!=-1){
		if(r) {
			for(int i=1;i<=n;i++){
				if(be[(i<<1)+1]) printf("%d ",i);
			}
			printf("\n");
		}
		else printf("die\n");
	}
}