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)的复杂度,可能是数据加强了吧。

 1 #include <bits/stdc++.h>
 2 #define rep(i, a, b) for (int i = a; i <= b; i++)
 3 #define REP(i, a, b) for (int i = a; i < b; i++)
 4 #define drep(i, a, b) for (int i = a; i >= b; i--)
 5 #define pb push_back
 6 #define mp make_pair
 7 #define clr(x) memset(x, 0, sizeof(x));
 8 #define xx first
 9 #define yy second
10 using namespace std;
11 typedef long long i64;
12 typedef pair<int, int> pii;
13 const int inf = ~0U>>1;
14 const i64 INF = ~0ULL>>1;
15 //***************************
16 const int maxn = 805;
17 char ma[maxn][maxn];
18 pii no[maxn][maxn];
19 int n, cnt_x, cnt_eq;
20 bitset<2005> eq[2005];
21 void init() {
22     rep(i, 1, n) {
23         if (ma[i][1] != ‘X‘) no[i][1].xx = ++cnt_x;
24         rep(j, 2, n) {
25             if (ma[i][j] == ‘X‘) continue;
26             if (no[i][j - 1].xx) no[i][j].xx = no[i][j - 1].xx;
27             else no[i][j].xx = ++cnt_x;
28         }
29     }
30     rep(i, 1, n) {
31         if (ma[1][i] != ‘X‘) no[1][i].yy = ++cnt_x;
32         rep(j, 2, n) {
33             if (ma[j][i] == ‘X‘) continue;
34             if (no[j - 1][i].yy) no[j][i].yy = no[j - 1][i].yy;
35             else no[j][i].yy = ++cnt_x;
36         }
37     }
38     cnt_eq = cnt_x;
39     rep(i, 1, cnt_x) eq[i].set(i);
40     rep(i, 1, n) rep(j, 1, n) if (no[i][j].xx) {
41         int l = no[i][j].xx, r = no[i][j].yy;
42         eq[l].flip(l), eq[l].flip(r), eq[r].flip(l), eq[r].flip(r);
43         if (1 ^ (ma[i][j] - ‘0‘)) eq[l].flip(cnt_x + 1), eq[r].flip(cnt_x + 1);
44     }
45 }
46 void gauss() {
47     rep(i, 1, cnt_x) {
48         rep(j, i, cnt_eq) if (eq[j][i] > eq[i][i]) { swap(eq[j], eq[i]); break; }
49         rep(j, 1, cnt_eq) if (i != j && eq[j][i]) eq[j] ^= eq[i];
50     }
51 }
52 int choice[2005];
53 int main() {
54     scanf("%d", &n);
55     rep(i, 1, n) scanf("%s", ma[i] + 1);
56     init();
57     gauss();
58     drep(i, cnt_x, 1) {
59         if (eq[i][i]) {
60             choice[i] = eq[i][cnt_x + 1];
61             drep(j, cnt_x, i + 1) if (eq[i][j]) choice[i] ^= choice[j];
62         }
63         else choice[i] = 0;
64     }
65     rep(i, 1, n) {
66         rep(j, 1, n)
67             if (ma[i][j] == ‘X‘) printf("0");
68             else printf("%d", 1 xor (ma[i][j] - ‘0‘) xor choice[no[i][j].xx] xor choice[no[i][j].yy]);
69         puts("");
70     }
71     return 0;
72 }

时间: 2024-11-11 09:26:30

Tsinsen-A1488 : 魔法波的相关文章

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

斐波那契数列——摘自搜狗百科

1数列公式 递推公式 斐波那契数列:0.1.1.2.3.5.8.13.21.34.55.89.144... 如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式: F(0) = 0,F(1)=F(2)=1,F(n)=F(n-1)+F(n-2) (n≥3) 通项公式 通项公式的推导方法一:利用特征方程 线性递推数列的特征方程为: X^2=X+1 解得 X1=(1+√5)/2, X2=(1-√5)/2. 斐波拉契数列则F(n)=C1*X1^n + C2*X2^n ∵F(1)=F(2

【Fate/kaleid liner 魔法少女☆伊莉雅】系列中实践的、新世代的动画摄影工作流

通常的日本动画的摄影中,是以追加Cell(celluloid 赛璐珞)与背景的合成滤镜处理为主,而在[Fate/kaleid liner 魔法少女☆伊莉雅]系列的,加入了自己使用3DCG软件来制作特效素材的新的摄影风格. 作为最后工程的摄影,也可以受益于3DCG软件 已经放映结束的本人气系列的第3季,[魔法少女☆伊莉雅 2wei Herz! ]中, Asahi Production 的中西康祐摄影导演带领的小组,在[Cell与CG的崭新融合]的概念下,实践了最新摄影工作流. [魔法少女☆伊莉雅

数据结构作业——魔法少女(平衡二叉树)

魔法少女之相亲大会 Description 由于之前的相亲大会的组织者太过糟糕,实验室的大家仍然没有摆脱 single dog 的命运!!所以请了魔法少女小风,来帮忙实验室脱单!于是光棍节这天,美少女小风重新组织一波相亲大会.她先让男生们按着帅气值高低,从左到右站成一排,接下来 n 秒,每一秒释放一次巴啦啦小风能量!小风能量随机出现"JX"时:粗线了一名男生,然后这个男生会根据自己的帅气值,走到队列里相应的位置. 小风能量随机出现"XQ"时:粗线了一名女生,女生会说

斐波那契数列实例讲解以及C++实现

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以<斐波纳契数列季刊>为名的一份数学杂志,用于专门刊载这方面的研究成果. 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,

(算是dp吧) 小茗的魔法阵 (fzu 2225)

http://acm.fzu.edu.cn/problem.php?pid=2225 Problem Description 在打败了易基•普罗布朗.诺姆•普罗布朗之后,小茗同学开始挑战哈德•普罗布朗. 一番交战之后,哈德展开了一大波攻击.小茗同学为了抵御攻击,一边放魔法阵一边放魔法阵,然后他也不知道自己一共放了几个魔法阵.回收魔法阵是需要花费时间的,为了抵御下一波攻击,小茗同学需要知道自己共放了几个魔法阵,由于情况紧急,这个任务需要由你来完成. 魔法阵是三角形△的,比如 ...........

&lt;东方梦符祭&gt; N2无尽40波通关

先上图吧 阵容:纯粹 + 伪魔法队 主C:神妈 露米娅(我觉得不厉害了) 灵梦 控制:琪露诺 + 蕾蒂 永江依玖(听说很厉害 没培育满 没看到效果) 挂件:铃仙挂机 帕秋莉 大妖精(链神妈) 圣今天才出的前50波还行也不知道厉害不厉害 起手双白 老鼠 12波才来秋香子 23波五星鼠 装备还抽的挺齐的 四把太阳伞没用上 露米娅四阴阳玉输出赶不上神妈的一半(难道是没放前面吗) 毕竟是R卡呀 40波的时候有点迷茫 只有露米娅和灵梦 感觉纯粹输出不够 不知道走魔法还是物理 还好选择了神妈 太强辣 要是不

课时49:魔法方法:生成器

目录: 一.生成器 二.课时49课后习题及答案 ********************* 一.生成器 ********************** 生成器的学习并不涉及魔法方法,甚至它巧妙地避开了类和对象,仅通过普通地函数就可以实现了. 生成器其实是迭代器的一种实现. 生成器的发明一方面是为了使得Python更为简洁,因为,迭代器需要我们自己去定义一个类和实现相关的方法,而生成器则只需要在普通的函数中加上一个yield语句即可. 另一方面,生成器的发明,使得Python模仿协同程序的概念得以实