abc298-F

题目链接:https://atcoder.jp/contests/abc298/submissions/40704498

思路:先离散化,再暴力二重循环枚举每一行每一列,但一定要加个优化,当r[i]+c[j]r[i]+c[j]val[i][j]

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
typedef pair<long long,int>P;
vector<int>num;
int A[N],B[N],V[N];
P RR[N],CC[N];
map<int,long long>R,C;
map<P,int>M;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin>>n;
    for (int i=1;i<=n;i++){
        int a,b,c;
        cin>>a>>b>>c;
        A[i] = a,B[i] = b,V[i] = c;
        num.push_back(a),num.push_back(b);
    }
    sort(num.begin(),num.end());
    num.erase(unique(num.begin(),num.end()),num.end());
    for (int i=1;i<=n;i++){
        int X = lower_bound(num.begin(),num.end(),A[i])-num.begin()+1;
        int Y = lower_bound(num.begin(),num.end(),B[i])-num.begin()+1;
        R[X] += V[i],C[Y] += V[i];
        M[{X,Y}] = V[i];
    }
    long long mx = 0;
    int cntr = 0,cntc = 0;
    for (auto r:R) RR[++cntr] = {r.second,r.first};
    for (auto c:C) CC[++cntc] = {c.second,c.first};
    sort(RR+1,RR+1+cntr);
    sort(CC+1,CC+1+cntc);
    for (int i=cntr;i>=1;i--){
        for (int j=cntc;j>=1;j--){
            if (mx>=RR[i].first+CC[j].first) break;
            else{
                if (M.count({RR[i].second,CC[j].second})){
                    mx = max(mx,RR[i].first+CC[j].first-M[{RR[i].second,CC[j].second}]);
                }else{
                    mx = max(mx,RR[i].first+CC[j].first);
                }
            }
        }
    }
    cout<<mx;
}

posted @   安潇末痕  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示