首页 > 其他分享 >[ARC135D] Add to Square 题解

[ARC135D] Add to Square 题解

时间:2024-02-05 21:24:19浏览次数:32  
标签:rpos Square rneg 题解 矩阵 Add cpos col row

题目链接

点击打开链接

题目解法

很牛的题!!!

先考虑一步很牛的转化:把矩阵黑白染色,且 \(i+j\) 为奇数的位置的值取反,每次操作变为左上右下 \(+v\),左下右上 \(-v\)
这样有啥好处?操作不会使行和列的和改变

考虑答案的下界显然是:\(\max\{\)行的绝对值之和,列的绝对值之和\(\}\)
这里给出结论:答案就是这个下界

证明的话分两步:

第一步
给出一个结论:一个矩阵,可以通过一些操作,得到任何一个 行的和与原矩阵相同,且列的和与原矩阵相同 的矩阵
为啥?
我们将原矩阵和目标矩阵对应位相减,那么目的就是使这个新矩阵全为 \(0\)
一个显然的事情是我们可以将原矩阵变为 \((n-1)\times (m-1)\) 的 \(0\),最后一行和最后一列是新矩阵的对应行和列的和,由此可得整个矩阵都为 \(0\)

第二步
有了上面的结论,我们现在只需要构造一个行与列的和都固定,且答案为下界的一个矩阵即可
如何构造(令 \(row_i\) 为行 \(i\) 的和,\(col_j\) 为列 \(j\) 的和):

  1. 如果有同号的 \(row_x,col_y\),最优的方案是把绝对值小的消去,所以 \(b_{x,y}\Leftarrow b_{x,y}+\min(row_x,row_y)\)
  2. 在情况 1 不存在时,此时行和列中必有一个和都为 \(0\)
    找到异号的 \(row_x,row_y\)(列同理),最优的方案是把绝对值小的消去

因为每次必能将一行或一列消成 \(0\),所以时间复杂度为 \(O(n^2)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=510;
int n,m,a[N][N];
LL row[N],col[N],b[N][N];
void doit(int x,int y,LL v){ b[x][y]+=v,row[x]-=v,col[y]-=v;}
int main(){
    n=read(),m=read();
    F(i,1,n) F(j,1,m){
        a[i][j]=read();
        if((i+j)&1) a[i][j]*=-1;
        row[i]+=a[i][j],col[j]+=a[i][j];
    }
    while(true){
        int rneg=0,rpos=0,cneg=0,cpos=0;
        F(i,1,n){
            if(row[i]<0) rneg=i;
            if(row[i]>0) rpos=i;
        }
        F(i,1,m){
            if(col[i]<0) cneg=i;
            if(col[i]>0) cpos=i;
        }
        if(rneg&&cneg) doit(rneg,cneg,max(row[rneg],col[cneg]));
        else if(rpos&&cpos) doit(rpos,cpos,min(row[rpos],col[cpos]));
        else if(rneg&&rpos){
            LL v=min(-row[rneg],row[rpos]);
            doit(rneg,1,-v),doit(rpos,1,v);
        }
        else if(cneg&&cpos){
            LL v=min(-col[cneg],col[cpos]);
            doit(1,cneg,-v),doit(1,cpos,v);
        }
        else break;
    }
    LL ans=0;
    F(i,1,n) F(j,1,m){
        ans+=abs(b[i][j]);
        if((i+j)&1) b[i][j]*=-1;
    }
    printf("%lld\n",ans);
    F(i,1,n){ F(j,1,m) printf("%lld ",b[i][j]);puts("");}
    return 0;
}

标签:rpos,Square,rneg,题解,矩阵,Add,cpos,col,row
From: https://www.cnblogs.com/Farmer-djx/p/18008833

相关文章

  • ChessFunctions+ActiveXControl+SharedAddIn三合一【Office和VBA中呈现中国象棋】
    本软件由三个项目构成,各自下载链接如下:ChessFunctions链接:https://pan.baidu.com/s/11pMnmd28nHtpTGCU9rwNHg提取码:1234ChessFunctions的帮助文件链接:https://pan.baidu.com/s/1uxJYx8gOd8sNEBlda3onnA提取码:1234ActiveXControl链接:https://pan.baidu.com/s/1CTLcXlQgZaD1_av......
  • luogu2647题解
    首先这道题没有规定选几个。一开始我以为是全选,然后想了个贪心才发现看错了。那我们先来假设选\(m\)个。这个题的每个物品都会影响后面物品的收益,不好看。由于每个物品\(i\)对后选的其他物品减少的收益都是\(R_i\),因此我们在保证总价值不变的情况下转化一下,把该物品的价......
  • P10125 「Daily OI Round 3」Simple 题解
    题目传送门简单模拟,主要考察字符串。首先输入一个char类型的数组,然后直接遍历每一位是否为Acoipp或Svpoll即可。//Simple//codeby:cq_irritater//time:2024/02/04#include<bits/stdc++.h>usingnamespacestd;chara[10];intmain(){//freopen("c......
  • 中文数字的应用及其问题解决之道
    中文数字,也称汉字数字,是中文语言中表示数字的一种方式。它们不仅有着悠久的历史和文化背景,还在日常生活中发挥着重要的作用。本文将探讨中文数字的应用领域,并介绍它们如何解决实际问题。中文数字-阿拉伯数字转换|一个覆盖广泛主题工具的高效在线平台(amd794.com)https:/......
  • P2367 语文成绩 题解
    语文成绩题目背景语文考试结束了,成绩还是一如既往地有问题。题目描述语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮她吗?输入格式第一行有两个整数\(n\),\(p\),代表学生数与增加分数的次数。......
  • 题解 ARC171D【Rolling Hash】
    来补题了。昨天赛时想法是对的,代码写错了,没调过太可惜了。显然\(P>n\)时必定有解。设前缀\([1,i]\)的哈希值为\(s_i\),显然\([l,r]\)的哈希值不为\(0\)的充要条件是\(s_{l-1}\nes_r\)。建立一个点的编号为\(0\simn\)的图,对于每个输入的区间\([l,r]\),连接一条边......
  • 谷歌新版本跨域错误深度剖析与解决:request client is not a secure context and the
    原文地址:https://blog.csdn.net/Flywithdawn/article/details/128253604 快速解决: ======================================================最近在测试http服务时,谷歌浏览器报了以下错误“Therequestclientisnotasecurecontextandtheresourceisinmore-privat......
  • 【洛谷 P2437】蜜蜂路线 题解(递归+记忆化搜索+高精度)
    蜜蜂路线题目描述一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房开始爬到蜂房,,有多少种爬行路线?(备注:题面有误,右上角应为)输入格式输入的值输出格式爬行有多少种路线样例#1样例输入#1114样例输出#1377提示对于100%的......
  • 题解 ARC171C【Swap on Tree】
    每棵子树内只可能有至多一个外来的数,且外来的数是多少并不影响方案数,因此考虑设\(f_{u,i,0/1}\)表示考虑以\(u\)为根的子树,与\(u\)相连的所有边中断了\(i\)条,且\(u\)与其父亲之间的边有没有断的方案数。设\(g_{u,c}=\sumf_{u,i,c}\)。每个节点的初始状态是\(f_{u,0,......
  • 题解 ARC171B【Chmax】
    考察题面中的操作究竟做了什么,不难发现其实是将所有满足\(P_i>i\)的\(i\toP_i\)连边,得到若干条链,然后\(B_i\)即为\(i\)所在链的最后一个节点。显然,存在\(A_i<i\)时无解,存在\(A_i\nei\)但\(A_j=i\)时也无解。否则,每个\(A_i\nei\)的位置填的数都唯一确定......