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 2594 Treasure Exploration(最小路径覆盖,可重点)
题意:选出最小路径覆盖图中所有点,路径可以交叉,也就是允许路径有重复的点. 分析:这个题的难点在于如何解决有重复点的问题-方法就是使用Floyd求闭包,就是把间接相连的点直接连上边,然后就是求最小路径 ...
- 英文SEO外部链接资源收集之常用的footprints
inurl:/privacy-policy "Using Article Directory plugin"inurl:/terms "Using Article D ...
- 动态规划2-----hdu1069
首先这道题目先要理解题目的意思. 用一些方块堆塔,给出的每种方块个数是无限的,只有满足长宽都小于下面一个方块的方块才能摆上去. 首先这道题需要一个转化. 每个方块有3个不同的面,每个面长宽交换,一共每 ...
- 使用ReTrofit做缓存(结合上拉加载和下拉刷新)
1. noCache 不使用缓存,全部走网络 2. noStore 不使用缓存,也不存储缓存 3. onlyIfCached 只使用缓存 4. maxAge 设置最大失效时间,失效则不使用 需要服务器 ...
- DedeCMS中实现在顶层banner中显示自定义登录信息
一.需求描述 dedeCMS自带的模板中有互动中心模块,如下图所示: 由于会员登陆对我来说不是网站的重要模块且默认DedeCMS的会员中心模块的初始化很慢,常会显示“正在载入中,请稍候...”, 所以 ...
- jquery 延迟执行实例介绍
代码如下: $(function(){ var $inputs = $('input[type=button]') .delay(500) .queue(function(){$(this).hide ...
- ASP.NET Cache 类
在查找资料的过程中.原来园子里面已经有过分析了.nopCommerce架构分析系列(二)数据Cache. 接下来是一些学习补充. 1.Nop中没有System.Web.Caching.Cache的实现 ...
- CATranstion动画
// 1.创建过度动画 CATransition *anima = [CATransition animation]; // 2.设置动画类型 anima.type = @"cube&quo ...
- 转:web_submit_data和web_submit_form的差别
在LoadRunner中有两个常用函数:Web_submit_form和Web_submit_data,在群里有人问这两个函数有什么区别.为什么会有两个不同却功能相似的函数.区别在哪里. 首先,从工具 ...
- 微信小程序登陆流程
#1:session_key和openId是什么?session_key 官方说明为:session_key是微信服务器生成的针对用户数据进行加密签名的密钥session_key的用途(1)对wx.g ...