ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

CF2065D Skibidus and Sigma

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;
}

 

返回列表