把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

ARC133C Row Column Sums

题面传送门
挺妙的,至少我场上想错了。
如果行列的和不同余肯定无解。
我们考虑对于每个格子都填上\(k-1\)然后在某些位置减去一些值。
设每一行至少要减去的值为\(C_i\),每一列至少要减去的值为\(D_i\),那么设\(Z=\max(\sum\limits_{i=1}^{n}{C_i},\sum\limits_{i=1}^{n}{D_i})\),则\(Z\)即为至少要减去的值。
同时也可构造证明\(Z\)至多要减去的值。
不妨设\(\sum\limits_{i=1}^{n}{C_i}\leq \sum\limits_{i=1}^{n}{D_i}\)
显然有\(\sum\limits_{i=1}^{n}{C_i}\equiv \sum\limits_{i=1}^{n}{D_i}(\bmod k)\pmod{k}\)
则前\(\sum\limits_{i=1}^{n}{D_i}\)个每次找一个位置满足\(C_i>0,D_j>0\)\((i,j)\)放即可。后面的放在一列上即可。
code:

#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define re register
#define RI re int
#define ll long long
#define db double
#define lb long db
#define N 200000
#define M 1000000
#define mod 1000000007
#define Mod (mod-1)
#define eps (1e-5)
#define U unsigned int
#define it iterator
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define d(x,y) (m*x+(y))
#define R(n) (rand()*rand()%(n)+1)
#define Pc(x) putchar(x)
using namespace std;
ll n,m,k,A[N+5],B[N+5],ToT,T1[N+5],T2[N+5],P1,P2,Ans,X,Y,Q1[N+5],Q2[N+5];
struct Ques{ll B,T;}S[N+5];I bool C1(Ques x,Ques y){return x.B<y.B;}
int main(){
//	freopen("1.in","r",stdin);
	RI i,j;scanf("%lld%lld%lld",&n,&m,&k);for(i=1;i<=n;i++) scanf("%lld",&A[i]),X+=A[i];for(i=1;i<=m;i++) scanf("%lld",&B[i]),Y+=B[i];
	if(X%k!=Y%k){puts("-1");return 0;}for(i=1;i<=n;i++) T1[i]=(1ll*(k-1)*m%k-A[i]+k)%k,P1+=T1[i];for(i=1;i<=m;i++) T2[i]=(1ll*(k-1)*n%k-B[i]+k)%k,P2+=T2[i];
	printf("%lld\n",1ll*(k-1)*n*m-max(P1,P2));
}
posted @ 2022-02-01 15:03  275307894a  阅读(132)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end