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 异或两次同一段路径的权值,就相当于没有走这段路径: 由此可以得到启发,对于不同的走法, ...
随机推荐
- poj 1654 Area(计算几何--叉积求多边形面积)
一个简单的用叉积求任意多边形面积的题,并不难,但我却错了很多次,double的数据应该是要转化为long long,我转成了int...这里为了节省内存尽量不开数组,直接计算,我MLE了一发...,最 ...
- PAT (Advanced Level) 1113. Integer Set Partition (25)
简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...
- python 从windows上传文件到linux脚本
import paramiko import datetime import os hostname = '192.168.112.132' username = 'root' password = ...
- Disassembly3:variable
Initializer C++ Primer上说:如果未初始化的Built-in type是定义在function外部的,那么它将自动被初始化为“0”:如果uninitialized的built-in ...
- 利用php函数mkdir递归创建层级目录
项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等.这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法. php默认的mkdir一次只能创建一层目录,而 ...
- Sphinx配置过程
http://www.oschina.net/question/84274_11938 http://www.ibm.com/developerworks/library/os-php-sphinxs ...
- Struts2语法--Ognl
OGNL: Object Graph Navigation Language index.jsp: <body> 访问属性 <a href="<%=contextPa ...
- ural1682 Crazy Professor
Crazy Professor Time limit: 1.0 secondMemory limit: 64 MB Professor Nathan Mathan is crazy about mat ...
- POJ 2240 Arbitrage Bellman_ford 判读是否存在正环
和POJ1860差不多,就是用bellmanford判读是否存在正环,注意的是同种货币之间也可以交换,就是说:A货币换A货币汇率是2的情况也是存在的. #include<stdio.h> ...
- ASP对数据库的操作方法
ASP与数据库-连接.写入.修改.删除.显示代码属性与方法 PageCount 属性: 决定 Recordset 对象包括多少“页”的数据. 这里的“页”是数据记录的集合,大小等于 Pa ...