Tsinsen-A1488 : 魔法波【高斯消元+异或方程组】
高斯消元。
自己只能想出来把每一个点看成一个变量,用Xi表示其状态,这样必定TLE,n^2 个变量,再加上3次方的高斯消元(当然,可以用bitset压位)。
正解如下:
我们把地图划分成一个个的横条和竖条,对于点i,我们用Li,Ri分别表示横着和竖着穿过它的,显然,对于每一个点,有且仅有一个L块和R块穿过。
得到第一个方程 YLi = sigma(Xp) p属于Li,YRi = sigma(Xp) p属于Ri --> sigma(Xp) xor Yi = 0.
接着我们考虑, Si xor YLi xor YRi xor Xi = 1 这是第二个方程,对其移项,那么变成了 Xi = 1 xor Si xor YLi xor YRi.
将其回带到第一个式子中即可,对于每一个点,放在不同的两个方程里,一个横的,一个竖的即可。
TLE50 我将枚举自由变量的语句删除后,发现没有TLE了,但是最多只有2000个障碍物,最多是O(2000^2)的复杂度,可能是数据加强了吧。
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define pb push_back
#define mp make_pair
#define clr(x) memset(x, 0, sizeof(x));
#define xx first
#define yy second
using namespace std;
typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U>>;
const i64 INF = ~0ULL>>;
//***************************
const int maxn = ;
char ma[maxn][maxn];
pii no[maxn][maxn];
int n, cnt_x, cnt_eq;
bitset<> eq[];
void init() {
rep(i, , n) {
if (ma[i][] != 'X') no[i][].xx = ++cnt_x;
rep(j, , n) {
if (ma[i][j] == 'X') continue;
if (no[i][j - ].xx) no[i][j].xx = no[i][j - ].xx;
else no[i][j].xx = ++cnt_x;
}
}
rep(i, , n) {
if (ma[][i] != 'X') no[][i].yy = ++cnt_x;
rep(j, , n) {
if (ma[j][i] == 'X') continue;
if (no[j - ][i].yy) no[j][i].yy = no[j - ][i].yy;
else no[j][i].yy = ++cnt_x;
}
}
cnt_eq = cnt_x;
rep(i, , cnt_x) eq[i].set(i);
rep(i, , n) rep(j, , n) if (no[i][j].xx) {
int l = no[i][j].xx, r = no[i][j].yy;
eq[l].flip(l), eq[l].flip(r), eq[r].flip(l), eq[r].flip(r);
if ( ^ (ma[i][j] - '')) eq[l].flip(cnt_x + ), eq[r].flip(cnt_x + );
}
}
void gauss() {
rep(i, , cnt_x) {
rep(j, i, cnt_eq) if (eq[j][i] > eq[i][i]) { swap(eq[j], eq[i]); break; }
rep(j, , cnt_eq) if (i != j && eq[j][i]) eq[j] ^= eq[i];
}
}
int choice[];
int main() {
scanf("%d", &n);
rep(i, , n) scanf("%s", ma[i] + );
init();
gauss();
drep(i, cnt_x, ) {
if (eq[i][i]) {
choice[i] = eq[i][cnt_x + ];
drep(j, cnt_x, i + ) if (eq[i][j]) choice[i] ^= choice[j];
}
else choice[i] = ;
}
rep(i, , n) {
rep(j, , n)
if (ma[i][j] == 'X') printf("");
else printf("%d", xor (ma[i][j] - '') xor choice[no[i][j].xx] xor choice[no[i][j].yy]);
puts("");
}
return ;
}
Tsinsen-A1488 : 魔法波【高斯消元+异或方程组】的更多相关文章
- BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)
题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #i ...
- UVA11542 Square(高斯消元 异或方程组)
建立方程组消元,结果为2 ^(自由变元的个数) - 1 采用高斯消元求矩阵的秩 方法一: #include<cstdio> #include<iostream> #includ ...
- [TS-A1488][2013中国国家集训队第二次作业]魔法波[高斯消元]
暴力直接解异或方程组,O(n^6)无法接受,那么我们考虑把格子分块,横着和竖着分别分为互不影响的块,这样因为障碍物最多不超过200个,那么块的个数最多为2*(800+200)=2000个,最后用bit ...
- UVa 11542 (高斯消元 异或方程组) Square
书上分析的太清楚,我都懒得写题解了.=_=|| #include <cstdio> #include <cstring> #include <cmath> #inc ...
- POJ.1830.开关问题(高斯消元 异或方程组)
题目链接 显然我们需要使每个i满足\[( ∑_{j} X[j]*A[i][j] ) mod\ 2 = B[i]\] 求这个方程自由元Xi的个数ans,那么方案数便是\(2^{ans}\) %2可以用^ ...
- UVA 11542 Square 高斯消元 异或方程组求解
题目链接:点击打开链接 白书的例题练练手. . . P161 #include <cstdio> #include <iostream> #include <algori ...
- 【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树
[题目大意] 给出一棵树,初始状态均为0,每反转一个节点的状态,相邻的节点(父亲或儿子)也会反转,问要使状态均为1,至少操作几次? [思路] 一场大暴雨即将来临,白昼恍如黑夜!happy! 和POJ1 ...
- poj1830(高斯消元解mod2方程组)
题目链接:http://poj.org/problem?id=1830 题意:中文题诶- 思路:高斯消元解 mod2 方程组 有 n 个变元,根据给出的条件列 n 个方程组,初始状态和终止状态不同的位 ...
- bzoj2115 [Wc2011] Xor——高斯消元 & 异或线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 异或两次同一段路径的权值,就相当于没有走这段路径: 由此可以得到启发,对于不同的走法, ...
随机推荐
- hdu_5723_Abandoned country(最小生成树)
题目链接:hdu_5723_Abandoned country 题意: 让你求最小生成树的花费,然后求任给两点的期望路程 题解: 最小生成树大家都会求,Kruskal这里要改改,因为后面要求任意两点的 ...
- hdu_4897_Little Devil I(树链剖分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4897 题意:有三种操作,1是在树上的两个节点之间的路径改变当前的颜色,2是改变树上有且只有一个端点在u ...
- Nginx配置proxy_pass【转载】
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走. 下面四种 ...
- css预处理器
Sass.LESS是什么?大家为什么要使用他们? 他们是CSS预处理器.他是CSS上的一种抽象层.他们是一种特殊的语法/语言编译成CSS. Less是一种动态样式语言. 将CSS赋予了动态语言的特 ...
- gridview中button事件处理
http://msdn.microsoft.com/zh-cn/library/bb907626.aspx 再结合如下: protected void GridView1_RowCommand(obj ...
- Object.wait()与Object.notify()的用法
http://www.cnblogs.com/xwdreamer/archive/2012/05/12/2496843.html 参考文献: object.wait()和object.notify() ...
- Spring MVC 与ExtJS完美集成
http://blog.csdn.net/q262800095/article/details/12021191 http://www.jb51.net/article/25267.htm
- SpringMVC+Spring+hibernate整合及分页
1. 新建web project 2. 引入jar, 3. 创建包com.tgb.web.controller, 下面创建包(dao,entity,service, config,spring,hib ...
- Android启动脚本init.rc(2)
在Android中使用启动脚本init.rc,可以在系统的初始化中进行简单的操作. init.rc启动脚本路径:system/core/rootdir/init.rc 内容: Commands:命令 ...
- stm32 IAP + APP ==>双剑合一(转)
源:http://blog.csdn.net/yx_l128125/article/details/13591743 (扩展-IAP主要用于产品出厂后应用程序的更新作用,上一篇博文详细的对IAP 升级 ...