[BZOJ 2303][Apio2011]方格染色:并查集
2017-05-03 17:46
316 查看
点击这里查看原题
黄学长的题解没完全看懂,留坑待填
http://hzwer.com/6678.html
黄学长的题解没完全看懂,留坑待填
http://hzwer.com/6678.html
/* User:Small Language:C++ Problem No.:2303 */ #include<bits/stdc++.h> #define ll long long #define inf 999999999 using namespace std; const int M=1e6+5,mod=1e9; int n,m,k,tot,f[M],F[M]; bool c[M],vis[M],mark[M]; vector<int> r[M],g[M]; int pow(int a,int b){ int res=1; while(b){ if(b&1) res=(ll)res*a%mod; a=(ll)a*a%mod; b>>=1; } return res; } int find(int x){ return x==f[x]?x:f[x]=find(f[x]); } int find2(int x){ if(x==F[x]) return x; int tmp=find2(F[x]); c[x]^=c[F[x]]; return F[x]=tmp; } bool add(int x,int y,int t){ int p=find2(x),q=find2(y); if(p==q) return (c[x]^c[y])==t; F[p]=q; c[p]=(c[x]^c[y]^t); return 1; } int main(){ freopen("data.in","r",stdin);// scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=k;i++){ int x,y,p; scanf("%d%d%d",&x,&y,&p); if(x==1) vis[y]=1; mark[x]=1; r[x].push_back(y); g[x].push_back(p); } for(int i=1;i<=m;i++) f[i]=F[i]=i; for(int i=1;i<=n;i++){ int siz=r[i].size(); for(int j=1;j<siz;j++){ int x=r[i][j],y=r[i][j-1],cx=g[i][j],cy=g[i][j-1]; int p=find(x),q=find(y); f[p]=q; if(vis[p]) vis[q]=1; int t=cx^cy; if(x%2!=y%2) t=(t^(i-1))&1; if(!add(x,y,t)){ printf("0\n"); return 0; } } } int tot=0; for(int i=1;i<=m;i++) tot+=(f[i]==i&&!vis[i]); for(int i=2;i<=n;i++) tot+=(!mark[i]); printf("%d\n",pow(2,tot)); return 0; }
相关文章推荐
- [BZOJ]2303: [Apio2011]方格染色 并查集
- BZOJ 2303: [Apio2011]方格染色 并查集神题
- bzoj 2303: [Apio2011]方格染色 (并查集)
- BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]
- bzoj 2303: [Apio2011]方格染色【并查集】
- BZOJ_2303_[Apio2011]方格染色 _并查集
- BZOJ 2303: [Apio2011]方格染色 题解
- bzoj 2303 Apio2011 方格染色
- 【bzoj 2303】【Apio2011】方格染色
- bzoj 2303: [Apio2011]方格染色
- BZOJ 2303 [Apio2011]方格染色
- [BZOJ2303][APIO2011]方格染色 异或+并查集
- [BZOJ2303]-[Apio2011]方格染色-并查集+题目性质
- BZOJ2303 APIO2011方格染色(并查集)
- [BZOJ2303][Apio2011]方格染色(数学相关+加权并查集)
- [杂题 异或 带权并查集] BZOJ2303: [Apio2011]方格染色
- 【BZOJ2303】【Apio2011】方格染色 异或方程+并查集
- 2303: [Apio2011]方格染色
- BZOJ2303: [Apio2011]方格染色
- [Apio2011]方格染色