首页 > 其他分享 >「杂题乱刷2」CF1219G

「杂题乱刷2」CF1219G

时间:2024-11-11 16:19:32浏览次数:1  
标签:maxn1 forl ll maxn2 CF1219G sumx 杂题 define

题目链接

CF1219G Harvester

解题思路

就是个嗯分讨题。

发现最终选择的方案总共就以下五种情况:

  • 选 \(4\) 行 \(0\) 列。

  • 选 \(3\) 行 \(1\) 列。

  • 选 \(2\) 行 \(2\) 列。

  • 选 \(1\) 行 \(3\) 列。

  • 选 \(0\) 行 \(4\) 列。

对于第一,五种情况,直接取每行或每列的前四大值即可,时间复杂度 \(O(n \log n)\)。

对于第二,四种情况,直接枚举取的单独的一行或一列。然后取每行或每列的前三大值即可,注意要去重,时间复杂度 \(O(nm \log n)\)。

对于第三种情况,我们可以直接枚举取的那两行。然后取每列的前二大值即可,注意要去重,时间复杂度 \(O(n^2m)\)。

总时间复杂度 \(O(n^2m)\),如果有 \(n > m\),记得翻转矩阵,这样就会有 \(n \le \sqrt{10^5}\),可以通过此题。

参考代码

#include<bits/stdc++.h>
using namespace std;
//#define map unordered_map
#define re register
#define ll long long
#define forl(i,a,b) for(re int (i)=(a);i<=(b);(i)++)
#define forr(i,a,b) for(re ll (i)=(a);i>=(b);(i)--)
#define pii pair<ll,ll>
#define mid ((l+r)>>1)
#define lowbit(x) (x&-x)
#define pb push_back
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
template<typename T1,typename T2>bool Max(T1&x,T2 y){if(y>x)return x=y,1;return 0;}
template<typename T1,typename T2>bool Min(T1&x,T2 y){if(y<x)return x=y,1;return 0;}
ll _t_;
void _clear(){}
ll n,m;
bool cmp(ll x,ll y){
    return x>y;
}
void solve()
{
    _clear();
    cin>>n>>m;
    ll c[n+5][m+5];
    ll a[min(n,m)+5][max(n,m)+5],b[m+5][n+5];
    ll ans=-1e18;
    forl(i,1,n)
        forl(j,1,m)
            cin>>c[i][j];
    if(n>m)
    {
        forl(i,1,n)
            forl(j,1,m)
                b[j][i]=c[i][j];
        swap(n,m);
        forl(i,1,n)
            forl(j,1,m)
                a[i][j]=b[i][j];
    }
    else
    {
        forl(i,1,n)
            forl(j,1,m)
                a[i][j]=c[i][j];
    }
    ll sumx[n+5]={},sumy[m+5]={},d[max(n,m)*2+5]={},k=0;
    forl(i,1,n)
        forl(j,1,m)
            sumx[i]+=a[i][j];
    forl(i,1,n)
        forl(j,1,m)
            sumy[j]+=a[i][j];
    k=0;
    forl(i,1,n)
        d[++k]=sumx[i];
    sort(d+1,d+1+k,cmp);
    Max(ans,d[1]+d[2]+d[3]+d[4]);
    forl(i,0,max(n,m)+4)
        d[i]=0;
    k=0;
    forl(i,1,m)
        d[++k]=sumy[i];
    sort(d+1,d+1+k,cmp);
    Max(ans,d[1]+d[2]+d[3]+d[4]);
    forl(i,0,max(n,m)+4)
        d[i]=0;

    forl(i,1,n)
    {
        forl(j,0,k+4)
            d[j]=0;
        k=0;
        forl(j,1,m)
            d[++k]=sumy[j]-a[i][j];
        sort(d+1,d+1+k,cmp);
        Max(ans,sumx[i]+d[1]+d[2]+d[3]); 
    }
    k=0;
    forl(i,0,max(n,m)+4)
        d[i]=0;

    forl(i,1,m)
    {
        forl(j,0,k+4)
            d[j]=0;
        k=0;
        forl(j,1,n)
            d[++k]=sumx[j]-a[j][i];
        sort(d+1,d+1+k,cmp);
        Max(ans,sumy[i]+d[1]+d[2]+d[3]); 
    }
    k=0;
    forl(i,0,max(n,m)+4)
        d[i]=0;   

    forl(i,1,n)
        forl(j,i+1,n)
        {
            ll maxn1=0,maxn2=0;
            forl(l,0,k+4)
                d[l]=0;
            k=0;
            forl(l,1,m)
            {
                ll num=sumy[l]-a[i][l]-a[j][l];
                if(maxn1==0)
                    maxn1=num;
                else if(maxn2==0)
                {
                    maxn2=num;
                    if(maxn1<maxn2)
                        swap(maxn1,maxn2);
                }
                else
                {
                    if(num>=maxn1)
                        maxn2=maxn1,maxn1=num;
                    else if(num>=maxn2)
                        maxn2=num;
                }
            }
            Max(ans,sumx[i]+sumx[j]+maxn1+maxn2);
        }
    cout<<ans<<endl;
}
int main()
{
//    freopen("tst.txt","r",stdin);
//    freopen("sans.txt","w",stdout);
    IOS;
    _t_=1;
//    cin>>_t_;
    while(_t_--)
        solve();
    QwQ;
}

标签:maxn1,forl,ll,maxn2,CF1219G,sumx,杂题,define
From: https://www.cnblogs.com/wangmarui/p/18540006

相关文章

  • 「杂题乱刷2」CF1354E
    题目链接CF1354EGraphColoring(*2100)解题思路发现这个东西就是类似于二分图染色的东西。因为\(2\)只能和\(1,3\)链接。其余种类的点都不能连接。不妨把\(1,3\)都看成同一个点放到最后处理。那么我们就相当于是要找到一种方案使得选择每个联通快的黑点或白点,使得最......
  • 「杂题乱刷2」CF1370F2
    题目链接CF1370F2TheHiddenPair(HardVersion)(*2700)题目描述真的很难吗?我们首先考虑找出第一个特殊点。我们可以先求出这两个点路径中的任意一个点。发现询问\(1\simn\)就使我们需要的询问、接下来以这个路径中的一个点为根来确定每个节点的深度。接下来考虑二......
  • 并查集+最小生成树 学习笔记+杂题 1
    图论系列:前言:相关题单:戳我算法讲解:戳我代码可能过多啊,到时候页面别卡死了,所以就把代码最前面的缺省源删了(反正就是几个头文件/defineintlonglong,自己加一下即可)。并查集记得初始化,最小生成树记得排序。P3367【模板】并查集板子题,给定\(n\)个元素,有2种操作,一种合并,......
  • 「杂题乱刷2」P11267
    题目链接P11267【MX-S5-T1】王国边缘解题思路先考虑对于\(1\simn\)中的每一个点往后跳\(1\)次会跳的距离。那么为什么只用处理\(1\simn\)这些点而不去处理其余的点往后跳的距离呢?我们可以发现,由于字符串是无线循环的,所以对于位置模\(n\)的结果相同时,那么往后跳......
  • 双连通分量学习笔记+杂题
    图论系列:前言:もしも明日がくるのならあなたと花を育てたいもしも明日がくるのならあなたと愛を語りたい走って笑って転んで相关题单:https://www.luogu.com.cn/training/641352一.割点与桥双连通分量是针对无向图来说的,有向图是强连通分量。在了解双连通分量之前需要先......
  • AGC 杂题
    AGC029CLexicographicconstraints有\(n\)个字符串,现在告知它们的长度\(a_i\),求使得\(\foralli\in[1,n),s_i<s_{i+1}\)的最小字符集大小。\(n\le2\times10^5,a_i\le10^9\)二分字符集大小\(|\Sigma|\),分类讨论,设起始字符为a:\(a_i<a_{i+1}\):显然\(s_{i+1}\leftarr......
  • ABC 杂题
    ABC186EThrone有\(n\)个圆形排列的椅子,一开始你在\(s+1\)上,每次可以向右移动\(k\)个位置,求移动到\(1\)的最小步数,或报告无解。\(2\len,k\le10^9\)很容易想到构造方程:\[s+qk\equiv0\pmodn\]\[q\equiv(n-s)k^{-1}\pmodn\]直接exgcd求逆元,算出在\([1,n-1]\)......
  • 杂题选做1
    杂题选做1[ARC112F]DieSiedler注意到如果存在某一个\(j\)满足这种牌的数量大于等于\(2j\),那么一定会兑换为\(j\bmodn+1\)的牌。所以我们考虑这个过程的逆过程,就是将一张牌\(j\)换成\((j-1)!2^{j-1}\)张\(1\)号牌,最终全部的牌都被转化为了\(1\)号牌,但是结果并......
  • 数据结构杂题乱记
    由于是杂题乱记所以题目大多数不会太难。目录P2572[SCOI2010]序列操作题目内容思路代码P2572[SCOI2010]序列操作题目内容给你一个\(01\)序列,支持\(5\)种操作:0lr区间赋值为\(0\);1lr区间赋值为\(1\);2lr区间取反,即\(0\)变\(1\)、\(1\)变\(0\);3lr询......
  • 杂题随笔 10.31 两道LIS相关的题
    https://www.luogu.com.cn/problem/AT_abc354_f题意:给定一个序列a,求出所有的i使得任意一个a的最长子序列包含i。解法:我们先求这个序列的LIS的长度maxx,然后再去正着求一遍最长上升子序列和反着求一遍最长下降子序列即可,如果拼起来等于maxx那么说明i这个点是满足要求的点。注意细......