CF2065D Skibidus and Sigma

参考代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 10,inf = 0x3f3f3f3f;
struct node{
    ll sum,id;
};
node t[N];
vector<ll> a[N];
ll n,m;
bool cmp(node x,node y){
    if(x.sum != y.sum) return x.sum > y.sum; //该行总和大的优先 
    for(int i = 0; i < m; i++) //否则比较x行和y行的字典序大的优先 
        if(a[x.id][i] != a[y.id][i]) return a[x.id][i] > a[y.id][i];
    return 0;
}
void solve()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++) a[i].clear(),t[i] = {0,i};//t[i].sum:第i个数组的总和 
    for(int i = 1; i <= n; i++)
    {
        ll sum = 0; //计算第i行的总和 
        for(int j = 1; j <= m; j++)
        {
            ll x; cin >> x;
            a[i].push_back(x);
            sum += x;
        }
        t[i].sum = sum; //设置第i行的总和 
    }
    sort(t + 1,t + 1 + n,cmp); //按每一行的总和进行排序,这样就能知道最大总和是第几行 
    ll ans = 0,sum = 0;
    for(int i = 1; i <= n; i++)
    {
        ll id = t[i].id; //排序后,id行就是当前最大总和的行 
        for(int j = 0; j < m; j++)
        {
            sum += a[id][j]; //sum计算前缀和 
            ans += sum; //ans根据题意要把每一个前缀和累加起来 
            //cout << sum << " " << ans << endl; //记得多输出数据检验是否正确 
        }
    }
    cout << ans << endl;
}
int main()
{
    int T; cin >> T;
    while(T--)
    {
        solve();
    }
    return 0;
}

 

posted @ 2025-09-27 20:01  CRt0729  阅读(7)  评论(0)    收藏  举报