結果
問題 | No.2501 Maximum Inversion Number |
ユーザー |
|
提出日時 | 2023-10-13 22:13:03 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,616 bytes |
コンパイル時間 | 2,110 ms |
コンパイル使用メモリ | 200,372 KB |
最終ジャッジ日時 | 2025-02-17 07:20:52 |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 10 WA * 4 RE * 3 |
ソースコード
#include <bits/stdc++.h>using namespace std;void solve() {int N, M;cin >> N >> M;vector<long long> L(N), R(N);for(int i = 0; i < N; i++) {cin >> L[i];}for(int i = 0; i < N; i++) {cin >> R[i];}long long low = accumulate(L.begin(), L.end(), (long long) 0);if(!(low<= (long long) M && (long long) M <= accumulate(R.begin(), R.end(), (long long) 0))) {cout << "-1\n";return;}if(N == 1) {cout << "0\n";return;}long long ALL = (long long) M * M;long long ok = 1000000000, ng = *min_element(L.begin(), L.end()) - 1;while(abs(ok - ng) > 1) {long long mid = (ok + ng) >> 1;long long S = 0;for(int i = 0; i < N; i++) {if(mid >= L[i]) {S += min(mid, R[i]) - L[i];}}if(low + S >= M) {ok = mid;} else {ng = mid;}}vector<long long> T(N);vector<int> id;for(int i = 0; i < N; i++) {if(R[i] <= ok) {T[i] = R[i];} else if(L[i] >= ok) {T[i] = L[i];} else {T[i] = ok;id.emplace_back(i);}}long long S = accumulate(T.begin(), T.end(), (long long) 0);if(S > M) {for(int i = 0; i < S - M; i++) {T[id[i]]--;}} else if(M > S) {for(int i = 0; i < M - S; i++) {T[id[i]]++;}}assert(accumulate(T.begin(), T.end(), (long long) 0) == M);for(int i = 0; i < N; i++) {ALL -= T[i] * T[i];}assert(ALL % 2 == 0);cout << ALL / 2 << '\n';}int main() {cin.tie(0); cout.tie(0);ios::sync_with_stdio(false);int T;cin >> T;while(T--) {solve();}return 0;}