zoukankan      html  css  js  c++  java
  • CF446B DZY Loves Modification 题解

    Codeforces
    Luogu

    Description.

    给定 \(n\times m\) 的矩阵,进行 \(K\) 次操作。
    每次操作选定一行或一列,获得这行、列的和的价值,并把整行、列减去 \(p\)
    \(K\) 次操作后价值和最大值。

    Nailve Solution.

    胡了个假的贪心。

    Solution.

    发现无论选哪行,对列的贡献都是相同的,所以可以行列拆开。
    发现行与列之间顺序是无关的,因为都是 \(s_i+s_j-p\),行和行、列和列之间也肯定无关。
    所以只需要关心选了多少行、选了多少列就行了。
    选多少行的贡献肯定是可以贪心计算的,直接用优先队列就行了。

    Coding.

    点击查看代码
    //是啊,你就是那只鬼了,所以被你碰到以后,就轮到我变成鬼了{{{
    #include<bits/stdc++.h>
    using namespace std;typedef long long ll;
    template<typename T>inline void read(T &x)
    {
    	x=0;char c=getchar(),f=0;
    	for(;c<48||c>57;c=getchar()) if(!(c^45)) f=1;
    	for(;c>=48&&c<=57;c=getchar()) x=(x<<1)+(x<<3)+(c^48);
    	f?x=-x:x;
    }
    template<typename T,typename...L>inline void read(T &x,L&...l) {read(x),read(l...);}//}}}
    int n,m;ll a[1005][1005],s1[1005],s2[1005],K,p,rs=-1e18;
    priority_queue<int>q1,q2;ll v1[1000005],v2[1000005];
    int main()
    {
    	read(n,m,K,p);for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) read(a[i][j]);
    	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) s1[i]+=a[i][j],s2[j]+=a[i][j];
    	for(int i=1;i<=n;i++) q1.push(s1[i]);
    	for(int i=1,v;i<=K;i++) v1[i]=v1[i-1]+(v=q1.top()),q1.pop(),q1.push(v-p*m);
    	for(int i=1;i<=m;i++) q2.push(s2[i]);
    	for(int i=1,v;i<=K;i++) v2[i]=v2[i-1]+(v=q2.top()),q2.pop(),q2.push(v-p*n);
    	for(int i=0;i<=K;i++) rs=max(rs,v1[i]+v2[K-i]-p*i*(K-i));
    	return printf("%lld\n",rs),0;
    }
    
  • 相关阅读:
    Python
    12C配置EM Express的https端口
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
    Java – How to add days to current date
    Java – Display all ZoneId and its UTC offset
    Java 8 – Period and Duration examples
    Java 8 – Convert Instant to ZonedDateTime
    Java 8 – Convert Instant to LocalDateTime
    Java 8 – How to format LocalDateTime
    how-to-convert-string-to-localdate
  • 原文地址:https://www.cnblogs.com/pealfrog/p/15432616.html
Copyright © 2011-2022 走看看