首页 > 其他分享 >[ABC276Ex] Construct a Matrix

[ABC276Ex] Construct a Matrix

时间:2023-05-02 22:00:57浏览次数:55  
标签:未知数 限制 Matrix limits 矩阵 Construct cr oplus ABC276Ex

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

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;
}

标签:未知数,限制,Matrix,limits,矩阵,Construct,cr,oplus,ABC276Ex
From: https://www.cnblogs.com/ying-xue/p/17368371.html

相关文章

  • 牛客 55994 2023牛客五一集训派对day3 D Points Construction Problem
    D-PointsConstructionProblem_2023牛客五一集训派对day3(nowcoder.com)将图上恰好\(n\)个点染成黑色,使得图上相邻的黑白点对数量恰好为\(m\)考虑\(n\)个黑点如果不相邻,则两个点的贡献互不影响考虑相邻的情况,我们把相邻的点连边,则贡献为每一个连通块的贡献的和,我们用......
  • Vulnhub靶机笔记2——matrix-breakout-2-morpheus
    一、介绍一个以《黑客帝国》为背景的靶场涉及内容主机发现端口服务扫描1.2不用工具实现ffuf目录爆破一句话木马反弹shellmsf,蚁剑使用图片隐写CVE-2022-0847漏洞利用二、环境攻击机:kali靶机:matrix-breakout-2-morpheus三、过程1、信息收集1.1主机存活扫描nma......
  • open3d Reconstruction system 问题解决
    1.https://github.com/luckyluckydadada/Azure-Kinect-DK-3D-reconstruction 2.open3d版本:0.14.10.16.00.17.0会报错:open3d.cuda.pybind.piplines.odommetry.OdomtryOptionbojecthasnoattribute'max_depth_diff' 3.结果问题一:    根据......
  • 张量(Tensor)、标量(scalar)、向量(vector)、矩阵(matrix)
    张量(Tensor):Tensor=multi-dimensionalarrayofnumbers张量是一个多维数组,它是标量,向量,矩阵的高维扩展,是一个数据容器,张量是矩阵向任意维度的推广注意,张量的维度(dimension)通常叫作轴(axis),张量轴的个数也叫作阶(rank)]标量(scalar):只有一个数字的张量叫标量(也叫标量张量、零维......
  • C++中关于默认构造函数(Default Constructor)
    读<<深度探索C++对象模型>>,第二章介绍了默认构造函数,自觉知识点虽基础但是很是被忽略,故作此文记录.关于基础概念不做介绍,先看代码#include<stdio.h>#include<string>classSample{public:intintVal;};classFoo{public:Foo(inta=1000):int......
  • POJ 3352 Road Construction 边双联通分量
    题目:http://poj.org/problem?id=3352题意:加上最少的边,使得改造后的图中去掉任意一条边后图依然连通,题中任意两个点之间不会有重边思路:删掉任意一条边图依然连通,意味着任意两点间有至少两条通路。对于边双连通分量内的任意两点,至少会有两条通路,所以求边双连通分量,缩点,求出度为1的点......
  • @PostConstruct的顺序
    其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入是发生在A的构造方法执行完之后的。如果想在生成对象时候完成某些初始化操作,而偏偏这些初始化操作又......
  • Educational Codeforces Round 48 (Rated for Div. 2) D. Vasya And The Matrix
    NowVasyaistakinganexaminmathematics.Inordertogetagoodmark,Vasyaneedstoguessthematrixthattheteacherhasconstructed!Vasyaknowsthatthematrixconsistsofnrowsandmcolumns.Foreachrow,heknowsthexor(bitwiseexcludingor)......
  • A Comparison and Evaluation of Multi-View Stereo Reconstruction Algorithms
    介绍多视图立体重建是计算机视觉领域中一个非常重要的研究方向,它可以应用于三维建模、虚拟现实、机器人导航等多个领域。然而,目前多视图立体重建领域存在着很多问题和挑战,例如精度不高、完整性不足等。因此,作者希望通过本文对当前主流算法进行比较和评估,为该领域的进一步发展提供......
  • Constructing Roads
    ConstructingRoadsTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):17199    AcceptedSubmission(s):6529ProblemDescriptionThereareNvillages,whicharenumberedfrom1toN,andyou......