参考代码:
#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; }