#include <bits/stdc++.h>
using namespace std;
int n, m, i, j, k;
map <long long, long long> x, y, f;
multimap <long long, long long> v;
long long ans, M=1e9+7;
int main(){
    scanf("%d", &n);
    while(n--){
        scanf("%d%d%d", &i, &j, &k);
        x[i] += k, y[j] += k, f[i*M+j] = k;
    }//x记录行之和,y记录列之和,f记录该位置的数字
    for(auto p=y.begin(); p!=y.end(); p++){
        v.insert(make_pair(p->second, p->first));
    }//列之和排序,确定行后,从大到小选,遇到一个交叉空位即可
    for(auto p=x.begin(); p!=x.end(); p++){//枚举行
        for(auto q=v.rbegin(); q!=v.rend(); q++){//枚举列
            i = p->first, j = q->second;
            if(f.find(i*M+j) == f.end()){
                ans = max(ans, p->second+q->first);
                break;//空位,不需要减重复的,后面更小推出循环
            }//第二重循环总次数O(n),因为每个元素只属于一行
            else{
                ans = max(ans, p->second+q->first-f[i*M+j]);
            }
        }
    }
    printf("%lld\n", ans);
    return 0;
}

作者 crxis

发表回复