bzoj2303
并查集+数学
这道题网上好像有两种解法。
这位写的很可读:http://blog.csdn.net/unicornt_/article/details/51901225
然后看完大概就懂了做法,但是实现上还有很多细小的地方。
cnt要-1,因为第一行和第一列会算两次。
数组要开四倍。
至于为什么要拆成两个点,这是因为分开考虑01.
为什么两个flag都要赋值?因为有可能根是放在列上了,就判不到了。
还需要思考一下。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
const ll mod = ;
struct dsu {
int fa[N * ];
void ini(int n)
{
for(int i = ; i <= n; ++i)
fa[i] = i;
}
int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void connect(int x, int y)
{
fa[find(x)] = find(y);
}
bool same(int x, int y)
{
return find(x) == find(y);
}
} u;
int n, m, k, s = -;
int x[N], y[N], c[N];
ll ans;
bool flag[N * ];
ll power(ll x, ll t)
{
ll ret = ;
for(; t; t >>= , x = x * x % mod) if(t & ) ret = ret * x % mod;
return ret;
}
void solve(int s)
{
u.ini( * n + * m + );
u.connect(, + * n);
u.connect(, + * n + );
for(int i = ; i <= k; ++i)
{
int p = ;
if(x[i] % == && y[i] % == ) p = ;
p = p ^ c[i] ^ s;
if(p)
{
u.connect(x[i] * , y[i] * + + * n);
u.connect(x[i] * + , y[i] * + * n);
}
else
{
u.connect(x[i] * , y[i] * + * n);
u.connect(x[i] * + , y[i] * + * n + );
}
}
int cnt = ;
memset(flag, , sizeof(flag));
for(int i = ; i <= n; ++i)
{
if(u.same(i * , i * + ))
return;
if(!flag[u.find(i * )])
{
flag[u.find(i * )] = flag[u.find(i * + )] = ;
++cnt;
}
}
for(int i = ; i <= m; ++i)
{
if(u.same(i * + * n, i * + * n + ))
return;
if(!flag[u.find(i * + * n)])
{
flag[u.find(i * + * n)] = flag[u.find(i * + * n + )] = ;
++cnt;
}
}
ans = (ans + power(2ll, cnt - )) % mod;
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
for(int i = ; i <= k; ++i)
{
scanf("%d%d%d", &x[i], &y[i], &c[i]);
if(x[i] == && y[i] == ) s = c[i];
}
if(s != ) solve();
if(s != ) solve();
printf("%lld\n", ans);
return ;
}
bzoj2303的更多相关文章
- [BZOJ2303][Apio2011]方格染色
[BZOJ2303][Apio2011]方格染色 试题描述 Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 × ...
- BZOJ2303 [Apio2011]方格染色 并查集
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2303 题意概括 现在有一个N*M矩阵,矩阵上只能填数字0或1 现在矩阵里已经有一些格子被填写了数字 ...
- BZOJ2303 APIO2011方格染色(并查集)
比较难想到的是将题目中的要求看做异或.那么有ai,j^ai+1,j^ai,j+1^ai+1,j+1=1.瞎化一化可以大胆猜想得到a1,1^a1,j^ai,1^ai,j=(i-1)*(j-1)& ...
- BZOJ2303 APIO2011方格染色
这题太神了 首先我们可以发现只有当i和j都是偶数时a[1][1]^a[1][j]^a[i][1]^a[i][j]=1才满足情况,其它时都为0 所以我们可以先把i和j都为偶数的地方^1变为0 下面才是最 ...
- BZOJ2303: [Apio2011]方格染色 【并查集】
Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 个或 3 ...
- [转载]hzwer的bzoj题单
counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ120 ...
- BZOJ刷题列表【转载于hzwer】
沿着黄学长的步伐~~ 红色为已刷,黑色为未刷,看我多久能搞完吧... Update on 7.26 :之前咕了好久...(足见博主的flag是多么emmm......)这几天开始会抽时间刷的,每天几道 ...
随机推荐
- [Windows Server 2003] 安装SQL Server 2005
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装SQL S ...
- MySQL主从备份配置
MySQL主从热备配置 两台服务器的MySQL版本都是5.5.41master:192.168.3.119slave:192.168.3.120 MySQL主服务器配置:1.创建用于备份的用户 gra ...
- transactoin
hibernate对数据的操作是封装在事务当中,并且默认是非自动提交方式.所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中.
- unittest 是什么?怎么用?
unittest单元测试框架详解 https://www.cnblogs.com/fighter007/p/8245063.html unittest最详细的解说 https://www.cnblog ...
- odoo api介绍
odoo api修饰器介绍与应用 参考文档:https://www.cnblogs.com/kfx2007/p/6093994.html 一.one one的用法主要用于self为单一集合的情况,被o ...
- Ubuntu_linux系统与网络服务管理
1.远程telnet联机:telnetd: 2.远程加密ssh联机:openssh: 3.webmin远程联机:webmin: 3.VNC远程图像界面控制:vino: 4.NAT网关服务器:iptab ...
- 洛谷 2147 SDOI2008 Cave 洞穴勘测
[题解] 动态树模板题,只要求维护森林的连通性,直接上板子即可. #include<cstdio> #include<algorithm> #define N 500010 # ...
- flask中的session cookie 测试 和 项目中的用户状态保持
# -*- coding:utf-8 -*- # Author: json_steve from flask import Flask, current_app, make_response, req ...
- Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)
题目链接: https://codeforces.com/contest/432/problem/D 题解: 做法一: KMP 显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大 ...
- JavaScript进阶----关于数字的方法,Math对象,日期对象,定时器,函数,for in
关于数字的方法: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...