結果
| 問題 |
No.3054 Modulo Inequalities
|
| コンテスト | |
| ユーザー |
Iroha_3856
|
| 提出日時 | 2025-03-07 22:59:34 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 728 ms / 2,500 ms |
| コード長 | 2,919 bytes |
| コンパイル時間 | 3,411 ms |
| コンパイル使用メモリ | 280,952 KB |
| 実行使用メモリ | 56,340 KB |
| 最終ジャッジ日時 | 2025-03-07 22:59:57 |
| 合計ジャッジ時間 | 19,749 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 31 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for (int i = (int)(l); i<(int)(r); i++)
#define ll long long
//1次元累積和
//全て0-indexedで処理
template<class T>
struct CumulativeSum {
int siz;
vector<T> S;
bool done;
CumulativeSum() : CumulativeSum(0) {}
CumulativeSum(int N) : CumulativeSum(vector<T>(N, 0)) {}
//累積和の構築はしない
CumulativeSum(vector<T> A) {
done = false;
siz = (int)A.size();
S.resize(siz+1);
S[0] = 0;
for (int i = 0; i < siz; i++) {
S[i+1] = A[i];
}
}
//累積
void build() {
assert(!done);
for (int i = 1; i <= siz; i++) {
S[i] += S[i-1];
}
done = true;
}
//加算(累積前のみ)
T add(int idx, T a) {
assert(!done);
return S[idx+1] += a;
}
//代入(累積前のみ)
T set(int idx, T a) {
assert(!done);
return S[idx+1] = a;
}
//取得(累積前、累積後両方とも可能だが、どちらを想定するかをexpected_doneで渡す)
[[nodiscard]]
T get(int idx, bool expected_done) {
assert(expected_done == done);
return S[idx+1];
}
//区間和取得(累積後のみ)
//半開区間で与える
[[nodiscard]]
T sum(int l, int r) {
assert(done);
l = max(l, 0); r = min(r, siz);
return S[r]-S[l];
}
};
int main() {
int N; cin >> N;
int M = 1'001'000;
vector<int> A(N), B(N), C(N);
rep(i, 0, N) {
cin >> A[i] >> B[i];
C[i] = A[i]-B[i];
}
int K = 1'100'000;
vector<int> cntA(K), cntB(K), cntC(2*K);
rep(i, 0, N) {
cntA[A[i]]++; cntB[B[i]]++;
cntC[C[i]+K]++;
}
CumulativeSum<int> SA(cntA), SB(cntB), SC(cntC);
SA.build(); SB.build(); SC.build();
vector<ll> score(M+1);
// cout << "ok" << endl;
for (int m = 1; m <= M; m++) {
// score[m] = sum(floor(A[i]/m)) - sum(floor(C[i]/m)) - sum(floor(B[i]/m))
score[m] = 0;
for (ll a = 0; a <= M/m; a++) {
//floor(A/m) = a
//ma <= A < m(a+1)
score[m] += a * SA.sum(m*a, m*(a+1));
// cout << "a : " << a << endl;
}
// cout << "done : a" << endl;
for (ll b = 0; b <= M/m; b++) {
score[m] -= b * SB.sum(m*b, m*(b+1));
}
// cout << "done : b" << endl;
for (ll c = -(M+m-1)/m; c <= M/m; c++) {
int l = c * m, r = (c+1) * m;
score[m] -= c * SC.sum(l+K, r+K);
}
// cout<< "done : " << m << "\n";
}
// cout << "ok" << endl;
ll max_sc = 0;
rep(i, 1, M+1) max_sc = max(max_sc, score[i]);
// cout << max_sc << endl;
rep(i, 1, M+1) {
if (max_sc == score[i]) {
cout << i << endl;
return 0;
}
}
}
Iroha_3856