SPOJ JZPLIT
Problem
Solution
考虑任意一个作为矩阵四个角的位置
\(r_i \oplus c_j\oplus a_{i,j}\oplus x_{i,j}=0\)
\(r_i \oplus c_{j+1}\oplus a_{i,j+1}\oplus x_{i,j+1}=0\)
\(r_{i+1}\oplus c_j\oplus a_{i+1,j}\oplus x_{i+1,j}=0\)
\(r_{i+1}\oplus c_{j+1}\oplus a_{i+1,j+1}\oplus x_{i+1,j+1}=0\)
\(a_{i,j}\oplus a_{i,j+1}\oplus a_{i+1,j}\oplus a_{i+1,j+1}\oplus x_{i,j}\oplus x_{i,j+1}\oplus x_{i+1,j}\oplus x_{i+1,j+1}=0\)
则只需要解出第一行第一列的操作方法就可以表示其他格子的操作方法。
未知的状态数就减少到\(O(n+m-1)\)。对于所有第一行第一列的格子列方程,即这行这列的所有操作异或后等于当前状态,然后bitset优化即可。
时间复杂度\(O(\frac {(n+m)^3} {32})\),注意卡常。
Code
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("Ofast")
#pragma GCC optimize(3)
#include <cstdio>
#include <bitset>
using namespace std;
typedef long long ll;
template <typename Tp> inline int getmin(Tp &x,Tp y){return y<x?x=y,1:0;}
template <typename Tp> inline int getmax(Tp &x,Tp y){return y>x?x=y,1:0;}
template <typename Tp> inline void read(Tp &x)
{
x=0;int f=0;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
if(f) x=-x;
}
int n,m,a[1010][1010],b[2010][2010],ans[1010][1010];
char s[1010];
bitset<2010> x[2010];
inline void calc(int i,int j,int id)
{
b[id][1]^=1;b[id][j]^=1;b[id][i+m-1]^=1;
b[id][n+m]^=a[1][1]^a[1][j]^a[i][1]^a[i][j];
}
void gauss()
{
int k;
for(int i=1;i<n+m;i++)
{
for(k=i;k<n+m;k++)
if(x[k][i]) break;
if(k>=n+m) continue;
if(k^i) swap(x[i],x[k]);
for(int j=1;j<n+m;j++)
if(i^j&&x[j][i])
x[j]^=x[i];
}
}
int main()
{
read(n);read(m);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
for(int j=1;j<=m;j++) a[i][j]=(s[j]=='1');
}
for(int i=1;i<n+m;i++) b[i][i]=1;
for(int i=1;i<n+m;i++) b[1][i]=1;
b[1][n+m]=a[1][1];
//the first eq
for(int i=2;i<=m;i++)
{
b[i][n+m]=a[1][i];
for(int j=1;j<=m;j++) b[i][j]=1;
}
for(int i=2;i<=n;i++)
{
b[i+m-1][n+m]=a[i][1];b[i+m-1][1]=1;
for(int j=m+1;j<n+m;j++) b[i+m-1][j]=1;
}
for(int i=2;i<=n;i++)
for(int j=2;j<=m;j++)
{
calc(i,j,j);
calc(i,j,i+m-1);
}
for(int i=1;i<n+m;i++)
for(int j=1;j<=n+m;j++)
if(b[i][j])
x[i].set(j);
gauss();
for(int i=1;i<=m;i++) ans[1][i]=x[i][n+m];
for(int i=2;i<=n;i++) ans[i][1]=x[i+m-1][n+m];
for(int i=1;i<=n;i++,putchar('\n'))
for(int j=1;j<=m;j++)
{
if(i>1&&j>1)
ans[i][j]=a[1][1]^a[i][1]^a[1][j]^a[i][j]^ans[1][1]^ans[i][1]^ans[1][j];
printf("%d",ans[i][j]);
}
return 0;
}
SPOJ JZPLIT的更多相关文章
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- SPOJ DQUERY D-query(主席树)
题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...
- SPOJ GSS3 Can you answer these queries III[线段树]
SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
- SPOJ bsubstr
题目大意:给你一个长度为n的字符串,求出所有不同长度的字符串出现的最大次数. n<=250000 如:abaaa 输出: 4 2 1 1 1 spoj上的时限卡的太严,必须使用O(N)的算法那才 ...
- 【SPOJ 7258】Lexicographical Substring Search
http://www.spoj.com/problems/SUBLEX/ 好难啊. 建出后缀自动机,然后在后缀自动机的每个状态上记录通过这个状态能走到的不同子串的数量.该状态能走到的所有状态的f值的和 ...
- 【SPOJ 1812】Longest Common Substring II
http://www.spoj.com/problems/LCS2/ 这道题想了好久. 做法是对第一个串建后缀自动机,然后用后面的串去匹配它,并在走过的状态上记录走到这个状态时的最长距离.每匹配完一个 ...
- 【SPOJ 8222】Substrings
http://www.spoj.com/problems/NSUBSTR/ clj课件里的例题 用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些..于是改成了数组... 这道题重点是求 ...
- SPOJ GSS2 Can you answer these queries II
Time Limit: 1000MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Description Being a ...
随机推荐
- 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...
- C++解析-外传篇(1):异常处理深度解析
0.目录 1.异常的最终处理 2.结束函数terminate() 3.小结 1.异常的最终处理 问题: 如果在main函数中抛出异常会发生什么? 如果异常不处理,最后会传到哪里? 下面的代码的输出什么 ...
- Docker学习笔记六:Docker搭建企业级私有仓库
前言 Docker不仅是一个强大的服务器部署工具,而且它还有一个官方的Docker Hub registry用于储存Docker镜像.上传镜像到Docker Hub是免费的,上传的镜像文件同时也对公共 ...
- SC命令(windows服务开启/禁用)
原文链接地址:https://blog.csdn.net/cd520yy/article/details/30976131 sc.exe命令功能列表: 1.更改服务的启动状态(这是比较有用的一个功能) ...
- hdu5279 YJC plays Minecraft 【分治NTT】
题目链接 hdu5279 题解 给出若干个完全图,然后完全图之间首尾相连并成环,要求删边使得两点之间路径数不超过\(1\),求方案数 容易想到各个完全图是独立的,每个完全图要删成一个森林,其实就是询问 ...
- 怎样才能高效地使用JQuery
1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能.下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的jQ ...
- Linux系统之路——用CentOS 7打造合适的科研环境
安装CentOS CentOS 7的安装与其他Linux发行版的安装差不多,个别地方稍有不同. 准备工作 准备材料 U盘:容量700M以上,用于制作U盘启动盘,因为在制作启动盘时会格式化U盘,所以U盘 ...
- stout代码分析之一:Duration类
Duration类用于表示时间长度,可精确到纳秒. 代码实现在duration.hpp中,测试代码:duration_tests.cpp 相关api如下: parse, 将字符串转化成Duration ...
- uva 1639 Candy (对数处理精度)
https://vjudge.net/problem/UVA-1639 有两个盒子各有n(n≤2*10 5 )个糖,每天随机选一个(概率分别为p,1-p),然后吃一颗糖. 直到有一天,打开盒子一看,没 ...
- HDU 1333 基础数论 暴力
定义一种数位simth数,该数的各位之和等于其所有质因子所有位数字之和,现给出n求大于n的最小该种数,n最大不超过8位,那么直接暴力就可以了. /** @Date : 2017-09-08 14:12 ...