记录编号 |
334827 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HZOI 2016]MC之旅:逃离基友 |
最终得分 |
100 |
用户昵称 |
Rapiz |
是否通过 |
通过 |
代码语言 |
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");
}
}