2303: [Apio2011]方格染色
来源:互联网 发布:数据库管理员是什么 编辑:程序博客网 时间:2024/04/30 10:41
2303: [Apio2011]方格染色
Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1452 Solved: 569
[Submit][Status][Discuss]
Description
Sam和他的妹妹Sara有一个包含n × m个方格的
表格。她们想要将其的每个方格都染成红色或蓝色。
出于个人喜好,他们想要表格中每个2 × 2的方形区
域都包含奇数个(1 个或 3 个)红色方格。例如,右
图是一个合法的表格染色方案(在打印稿中,深色代
表蓝色,浅色代表红色) 。
可是昨天晚上,有人已经给表格中的一些方格染上了颜色!现在Sam和Sara
非常生气。不过,他们想要知道是否可能给剩下的方格染上颜色,使得整个表格
仍然满足她们的要求。如果可能的话,满足他们要求的染色方案数有多少呢?
Input
输入的第一行包含三个整数n, m和k,分别代表表格的行数、列数和已被染
色的方格数目。
之后的k行描述已被染色的方格。其中第 i行包含三个整数xi, yi和ci,分别
代表第 i 个已被染色的方格的行编号、列编号和颜色。ci为 1 表示方格被染成红
色,ci为 0表示方格被染成蓝色。
Output
输出一个整数,表示可能的染色方案数目 W 模 10^9得到的值。(也就是说,如果 W大于等于10^9,则输出 W被10^9除所得的余数)。
对于所有的测试数据,2 ≤ n, m ≤ 106
,0 ≤ k ≤ 10^6
,1 ≤ xi ≤ n,1 ≤ yi ≤ m。
Sample Input
3 4 3
2 2 1
1 2 0
2 3 1
2 2 1
1 2 0
2 3 1
Sample Output
8
HINT
数据为国内数据+国际数据+修正版
鸣谢GYZ
Source
#include<iostream>#include<cstdio>#include<queue>#include<vector>#include<bitset>#include<algorithm>#include<cstring>#include<map>#include<stack>#include<set>#include<cmath>#include<ext/pb_ds/priority_queue.hpp>using namespace std;const int maxn = 2E6 + 10;const int mo = 1E9;int n,m,k,tot,Ans,cnt,fa[maxn],r[maxn],c[maxn],typ[maxn];int getfa(int x) {return x == fa[x]?x:fa[x] = getfa(fa[x]);}void Solve(int Now){for (int i = 1; i <= n + m; i++) fa[i] = i;fa[1] = 1 + n;for (int i = 1; i <= k; i++) {int fr = getfa(r[i]);int fc = getfa(c[i] + n);int flag = typ[i]^Now;if (r[i] % 2 == 0 && c[i] % 2 == 0) flag ^= 1;if (!flag && fr != fc) fa[fr] = fc;}for (int i = 1; i <= k; i++) {int fr = getfa(r[i]);int fc = getfa(c[i] + n);int flag = typ[i]^Now;if (r[i] % 2 == 0 && c[i] % 2 == 0) flag ^= 1;if (flag && fr == fc) return;}for (int i = 1; i <= k; i++) {int fr = getfa(r[i]);int fc = getfa(c[i] + n);if (fr != fc) fa[fr] = fc;}int ans = -1; for (int i = 1; i <= n + m; i++)if (i == getfa(i)) {if (ans == -1) ans = 1;else ans *= 2,ans %= mo;}if (ans != -1) Ans = (Ans + ans) % mo;}int getint(){char ch = getchar();int ret = 0;while (ch < '0' || '9' < ch) ch = getchar();while ('0' <= ch && ch <= '9')ret = ret*10 + ch - '0',ch = getchar();return ret;}int main(){//freopen("2303.in","r",stdin);//freopen("2303.out","w",stdout);n = getint(); m = getint();k = getint();for (int i = 1; i <= k; i++) {r[i] = getint();c[i] = getint();typ[i] = getint();}for (int i = 0; i < 2; i++) Solve(i);cout << Ans;return 0;}
0 0
- 2303: [Apio2011]方格染色
- bzoj 2303 Apio2011 方格染色
- BZOJ 2303 [Apio2011]方格染色
- BZOJ 2303: [Apio2011]方格染色 并查集神题
- BZOJ2303: [Apio2011]方格染色
- [Apio2011]方格染色
- [Apio2011]方格染色
- BZOJ2303: [Apio2011]方格染色
- bzoj 2303: [Apio2011]方格染色 并查集
- bzoj 2303: [Apio2011]方格染色 (并查集)
- [BZOJ 2303][Apio2011]方格染色:并查集
- [BZOJ]2303: [Apio2011]方格染色 并查集
- 【BZOJ2303】【Apio2011】方格染色 异或方程+并查集
- [BZOJ2303][APIO2011]方格染色 异或+并查集
- [BZOJ2303]-[Apio2011]方格染色-并查集+题目性质
- [BZOJ2303][Apio2011]方格染色(数学相关+加权并查集)
- [杂题 异或 带权并查集] BZOJ2303: [Apio2011]方格染色
- 2017.10.22 方格染色 失败总结
- 利用webView实现加载网络图片居中并适应手机屏幕,以及img设置前缀
- IIC程序
- 实验二———任务一
- 硬盘MBR,DBR,等数据结构的详细参数
- 每日做题记录
- 2303: [Apio2011]方格染色
- 基础练习 数列排序
- 个人笔记
- 1.2Activity 和Intent之标准体重计算器
- C++11中std::move的使用
- EasyUI 验证框使用方法
- 413.Reverse Integer-反转整数(容易题)
- Spoj - 1825 Free tour II(树的点分治)
- 九度1084 整数拆分