没有题解,所以来写一篇。

Description

构造一个 \(N\times N\) 的矩阵 \(A\),其中 \(A_{i,j}\in {0,1,2}\),要求同时满足 \(Q\) 条限制。

每条限制形如:给定 \(a,b,c,d,e\),要求 \(A\) 满足 \(\prod\limits_{i=a}^b\prod\limits_{j=c}^d A_{i,j} \equiv e\pmod 3\)。

Solution

为贴合原题,设 \((a,b,c,d)\) 表示左上角为 \((a,c)\),右下角为 \((b,d)\) 的矩形。

根据连乘的性质,若 \(e_i\) 不为 \(0\),则 \((a_i,b_i,c_i,d_i)\) 中任意 \(A_{i,j}\) 不能为 \(0\)。

而对于 \(e_i=0\),要求 \((a,b,c,d)\) 中至少一个是 \(0\)。那么对于不被 \(e_i\in\{1,2\}\) 限制的点,显然强制它们都为 \(0\) 一定不劣。如果这种方式依然不能满足所有 \(e_i=0\) 的限制,则无解。

现在我们已经确定哪些位置为 \(0\),只需要考虑不为 \(0\) 的位置与 \(e_i\in\{1,2\}\) 的限制。而 \(A_{i,j}=1\) 对矩阵积同样没有影响,矩阵积模 \(3\) 的值只与 \(A_{i,j}=2\) 的数量有关。

简单找规律(?)可以发现,\(2\) 的奇数次幂 \(\bmod 3\) 的值为 \(2\),偶数次幂 \(\bmod 3\) 的值为 \(1\)。

考虑把每个 \(A_{i,j}\) 设为未知数解方程。

令 \(x_{i,j}\) 的值 \(0,1\) 对应 \(A_{i,j}\) 的 \({1,2}\),那么会得到 \(Q\) 组方程,形如:

\[x_{a,c}\oplus x_{a,c+1}\oplus\dots\oplus x_{b,d}=[e_i=1]
\]

未知数个数为 \(n^2\),直接高斯消元复杂度不能接受。

重定义 \(x_{a,b}=\sum\limits_{i=1}^a\sum\limits_{j=1}^b A_{i,j} \pmod 2\),则每个方程可以写成:

\[x_{b,d}\oplus x_{a-1,c-1}\oplus x_{a-1,d}\oplus x_{b,c-1}=[e_i=1]
\]

这样每次询问最多会产生 \(4\) 个未知数,未知数个数降为 \(4Q\)。

发现系数只有 \(0,1\),使用 bitset 优化,复杂度降为 \(O(\frac{Q^3}{w})\),可以通过。

Code

通过研读部分提交记录才得以大致理解做法,代码可能有参考。

#include<bits/stdc++.h>
#define il inline
using namespace std;
il int read()
{
int xr=0,F=1; char cr;
while(cr=getchar(),cr<'0'||cr>'9') if(cr=='-') F=-1;
while(cr>='0'&&cr<='9')
xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
return xr*F;
}
const int N=2005;
int n,q;
struct node{
int a,b,c,d,e;
};
vector<node> t;
bitset<(N<<2)> now,a[N<<2];
int id[N][N],s[N][N],tot;
il void add(int x,int y)
{
if(!x||!y) return;
if(!id[x][y]) id[x][y]=++tot;
now[id[x][y]]=1;
}
bool flag;
il void ins()
{
for(int i=1;i<=tot;i++)
{
if(!now[i]) continue;
if(!a[i][i]) {a[i]=now;return;}
now^=a[i];
}
if(now[0]) {printf("No\n");flag=1;}
}
int ans[N][N];
int main()
{
n=read(),q=read();
for(int i=1;i<=q;i++)
{
int a=read(),b=read(),c=read(),d=read(),e=read();
if(!e) t.push_back({a,b,c,d,e});
else
{
s[a][c]++,s[b+1][d+1]++,s[b+1][c]--,s[a][d+1]--;
now.reset();
add(a-1,c-1),add(b,d),add(a-1,d),add(b,c-1);
if(e==2) now[0]=1; ins();
if(flag) return 0;
}
}
//for(int i=1;i<=tot;i++,cout<<endl) for(int j=1;j<=n+1;j++) cout<<a[i][j]<<" "; for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+s[i][j];
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) s[i][j]=!s[i][j];
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]+s[i][j];
for(auto u:t)
if(s[u.b][u.d]-s[u.b][u.c-1]-s[u.a-1][u.d]+s[u.a-1][u.c-1]==0) {printf("No\n");return 0;} now.reset();
for(int i=tot;i;i--)
{
if(!a[i][i]) continue;
now[i]=((now&a[i]).count()&1)^(a[i][0]);
}
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(id[i][j]) ans[i][j]=now[id[i][j]];
for(int i=n;i;i--) for(int j=n;j;j--)
ans[i][j]=ans[i][j]^ans[i-1][j]^ans[i][j-1]^ans[i-1][j-1]; printf("Yes\n");
for(int i=1;i<=n;i++,printf("\n"))
for(int j=1;j<=n;j++)
{
if(s[i][j]-s[i-1][j]-s[i][j-1]+s[i-1][j-1]) printf("0 ");
else if(ans[i][j]) printf("2 ");
else printf("1 ");
}
return 0;
}

[ABC276Ex] Construct a Matrix的更多相关文章

  1. FZU 1911 Construct a Matrix

    题目链接:Construct a Matrix 题意:构造一个矩阵,要求矩阵的每行每列的和都不相同.矩阵的边长是前n项斐波那契的和. 思路:由sn = 2*(fn-1)+(fn-2)-1,只要知道第n ...

  2. fzu 1911 Construct a Matrix(矩阵快速幂+规律)

    题目链接:fzu 1911 Construct a Matrix 题目大意:给出n和m,f[i]为斐波那契数列,s[i]为斐波那契数列前i项的和.r = s[n] % m.构造一个r * r的矩阵,只 ...

  3. fzu 1911 C. Construct a Matrix

    C. Construct a Matrix Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 32768KB Special Judge ...

  4. Construct a Matrix (矩阵快速幂+构造)

    There is a set of matrixes that are constructed subject to the following constraints: 1. The matrix ...

  5. <转载> OpenGL Projection Matrix

    原文 OpenGL Projection Matrix Related Topics: OpenGL Transformation Overview Perspective Projection Or ...

  6. Palindromic Matrix

    Palindromic Matrix time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. Codeforces Round #540 (Div. 3) C. Palindromic Matrix 【暴力】

    任意门:http://codeforces.com/contest/1118/problem/C C. Palindromic Matrix time limit per test 2 seconds ...

  8. AP(affinity propagation)研究

    待补充…… AP算法,即Affinity propagation,是Brendan J. Frey* 和Delbert Dueck于2007年在science上提出的一种算法(文章链接,维基百科) 现 ...

  9. 最喜欢的算法(们) - Levenshtein distance

    String Matching: Levenshtein distance Purpose: to use as little effort to convert one string into th ...

  10. 利用奇异值分解(SVD)简化数据

    特征值与特征向量 下面这部分内容摘自:强大的矩阵奇异值分解(SVD)及其应用 特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法.两者有着很紧密的关系,在接下来会谈到,特征值分解和奇异值分解的 ...

随机推荐

  1. 2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n = 100。 输出:10。

    2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数. 输入:n = 100. 输出:10. 答案2023-07-11: 函数的主要思路如下: ...

  2. elasticSearch初步学习反思

    转自自己的qq空间 2022年11月29日 每次找到新技术就会发癫 把业务整理完了 看着elasticSearch开始发癫 TM的把所有的一切都塞给它 反正全标记索引要啥拿啥 狠狠地获取就完了 思来想 ...

  3. python:导入库、模块失败

    一般发生在程序开始部分: from pymodbus.client.sync import ModbusSerialClient from pymodbus.payload import Binary ...

  4. iptables简要介绍及使用iptables实践NAT技术

    简介 iptables的文章多如牛毛,但是,我读了一些,发现虽然成体系,但是不便理解,今天就结合自己的理解,好好讲解下,另外,我们也会使用iptables来实验一个nat地址转换的demo,nat转换 ...

  5. 烧死10亿脑细胞的SQL长啥样?

    1 前言 今天在生产中碰到了一个让我十分费解的 SQL,十分有趣. 2 现象 SQL 很好复现,就是逻辑看起来有点唬人 postgres=# create table test(id1 int,id2 ...

  6. Python数据可视化-折线图

    Python数据可视化-折线图 一.JSON数据格式 1.1 什么是json JSON是一种轻量级的数据交互格式.可以按照JSON指定的格式去组织和封装数据 JSON本质上是一个带有特定格式的字符串 ...

  7. opencv中的函数

    读入图像:cv2.imread(),第一个参数:未文件路径,第二个参数:告诉函数要以何种方式读取图片. cv2.IMREAD_COLOR:读入一幅彩色图像.图像的透明度会被忽略. cv2.IMREAD ...

  8. 利用CI机制管控jar依赖树

    1. 现状·问题 你还记得你排查jar冲突的付出么? 为了有效控制jar包更新带来的未知jar引入和变动,我们经常使用dependency-tree来查看依赖关系排查问题,通常是出现问题再被动分析和排 ...

  9. 机器学习-评价指标-AUCROC

    The Area Under the Receiver Operating Characteristic (AUC-ROC) curve is a performance metric commonl ...

  10. 用 ChatGPT 做一个 Chrome 扩展 | 京东云技术团队

    用ChatGPT做了个Chrome Extension 最近科技圈儿最火的话题莫过于ChatGPT了. 最近又发布了GPT-4,发布会上的Demo着实吸睛. 笔记本上手画个网页原型,直接生成网页.网友 ...