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......)这几天开始会抽时间刷的,每天几道 ...
随机推荐
- c#——值类型与引用类型
值类型传的是值 引用类型传的是地址
- C# ADO.NET动态数据的增删改查(第五天)
一.插入登录框中用户输入的动态数据 /// <summary> /// 添加数据 /// </summary> /// <param name="sender& ...
- servlet得到web应用路径
package context; import java.io.IOException; import javax.servlet.ServletContext; import javax.servl ...
- CStatic设置位图
CStatic 用于显示位图 如果要显示图标,则必须要设置窗口属性为 SS_BITMAP 和 SS_CENTERIMAGE,实例代码如下: //获得指向静态控件的指针 CStatic *pStatic ...
- Html5 WebSocket详细介绍
什么是WebSocket?看过html5的同学都知道,WebSocket protocol 是HTML5一种新的协议.它是实现了浏览器与服务器全双工通信(full-duplex).HTML5定义了We ...
- 《Mysql - 到底可不可以使用 Join ?》
一:Join 的问题? - 在实际生产中,使用 join 一般会集中在以下两类: - DBA 不让使用 Join ,使用 Join 会有什么问题呢? - 如果有两个大小不同的表做 join,应该用哪个 ...
- const浅析
前言 c++中使用到const的地方有很多, 而且const 本身也针对不同的类型可能有不同的含义, 比如对指针就有顶层和底层. 本节就是探讨关于C++中const的在不同的地方不同表现或含义. co ...
- 配置yum仓库和rpm包
作业一: 1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分 ...
- vue 中全局filter过滤器的配置及使用
在项目中使用到的经常用到过滤器,比如时间,数据截取等过滤器,如果在每个.vue中都可以复制同一个过滤器,这可以达到目的,但是遇到方法有bug时就需要诸葛修改进入不同的页面修改,这样既费时又费力,优先可 ...
- 【学QT】1 - QT的安装
1.解压文件在/usr/local/下 #tar zxvf qt-x11-free-3.3.8b.tar.gz -C /usr/local 更改文件夹名称为qt #mv /usr/local/qt-x ...