結果
| 問題 |
No.924 紲星
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-11-08 22:27:27 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 4,448 bytes |
| コンパイル時間 | 3,011 ms |
| コンパイル使用メモリ | 207,004 KB |
| 実行使用メモリ | 134,404 KB |
| 最終ジャッジ日時 | 2024-09-15 01:39:28 |
| 合計ジャッジ時間 | 9,209 ms |
|
ジャッジサーバーID (参考情報) |
judge6 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 5 TLE * 1 -- * 10 |
ソースコード
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define repr(i, n) for (int i = (n) - 1; i >= 0; i--)
#define repe(i, l, r) for (int i = (l); i < (r); i++)
#define reper(i, l, r) for (int i = (r) - 1; i >= (l); i--)
#define repi(i, l, r) for (int i = (l); i <= (r); i++)
#define repir(i, l, r) for (int i = (r); i >= (l); i--)
#define range(a) a.begin(), a.end()
void init_io() { std::cin.tie(nullptr); std::ios::sync_with_stdio(false); std::cout << std::fixed << std::setprecision(15); }
using namespace std;
using ll = long long;
template<class T>
struct wavelet_matrix {
vector<int> dat;
vector<vector<int>> cnt;
vector<T> dic;
wavelet_matrix(const vector<T> &a) : dat(a) {
const int n = dat.size();
dic.assign(a.begin(), a.end());
sort(dic.begin(), dic.end());
dic.erase(unique(dic.begin(), dic.end()), dic.end());
for (int i = 0; i < n; i++) {
dat[i] = lower_bound(dic.begin(), dic.end(), a[i]) - dic.begin();
}
int H = 1;
while ((1 << H) < dic.size()) H++;
cnt.resize(H, vector<int>(n + 1));
auto dfs = [&](auto dfs, int l, int r, int h) -> void {
if (r - l == 0) return;
if (h == H) return;
for (int i = l; i < r; i++) {
cnt[h][i + 1] = cnt[h][i] + (~dat[i] >> (H - 1 - h) & 1);
}
int m = stable_partition(dat.begin() + l, dat.begin() + r, [&](T x) {
return ~x >> (H - 1 - h) & 1;
}) - dat.begin();
dfs(dfs, l, m, h + 1);
dfs(dfs, m, r, h + 1);
};
dfs(dfs, 0, n, 0);
}
T quantile(int l, int r, int k) {
const int n = cnt[0].size() - 1;
int a = 0;
int b = n;
for (int i = 0; i < cnt.size(); i++) {
int cnt0 = cnt[i][b] - cnt[i][a];
int c = cnt[i][r] - cnt[i][l];
if (k < c) {
l = a + cnt[i][l] - cnt[i][a];
r = a + cnt[i][r] - cnt[i][a];
b = a + cnt0;
} else {
l += cnt[i][b] - cnt[i][l];
r += cnt[i][b] - cnt[i][r];
k -= c;
a += cnt0;
}
}
return dic[dat[l]];
}
};
// T: ring
template<class T, int H>
struct wavelet_matrix2 {
vector<vector<int>> cnt;
vector<vector<T>> sum;
wavelet_matrix2(vector<pair<int, T>> a) : cnt(H, vector<int>(a.size() + 1)), sum(H + 1, vector<T>(a.size() + 1)) {
auto dfs = [&](auto dfs, int l, int r, int h) -> void {
if (r - l == 0) return;
for (int i = l; i < r; i++) {
sum[h][i + 1] = sum[h][i] + a[i].second;
}
if (h == H) return;
for (int i = l; i < r; i++) {
cnt[h][i + 1] = cnt[h][i] + (~a[i].first >> (H - 1 - h) & 1);
}
int m = stable_partition(a.begin() + l, a.begin() + r, [&](pair<int, T> x) {
return ~x.first >> (H - 1 - h) & 1;
}) - a.begin();
dfs(dfs, l, m, h + 1);
dfs(dfs, m, r, h + 1);
};
dfs(dfs, 0, a.size(), 0);
}
// [l,r) * [b,t)
T query(int l, int r, int b, int t) {
auto dfs = [&](auto dfs, int l, int r, int b, int t, int ll, int rr, int bb, int tt, int h) -> T {
if (r - l == 0 || t - b == 0) return T();
if (tt <= b || t <= bb) return T();
if (b <= bb && tt <= t) return sum[h][r] - sum[h][l];
int mm = ll + cnt[h][rr] - cnt[h][ll];
T vl = dfs(dfs, ll + cnt[h][l] - cnt[h][ll], ll + cnt[h][r] - cnt[h][ll], b, t, ll, mm, bb, (bb + tt) / 2, h + 1);
T vr = dfs(dfs, l + cnt[h][rr] - cnt[h][l], r + cnt[h][rr] - cnt[h][r], b, t, mm, rr, (bb + tt) / 2, tt, h + 1);
return vl + vr;
};
return dfs(dfs, l, r, b, t, 0, cnt[0].size() - 1, 0, 1<<H, 0);
}
};
int main() { init_io();
int N, Q; cin >> N >> Q;
vector<ll> A(N); rep(i, N) cin >> A[i];
vector<ll> S(N + 1);
vector<ll> dic(A);
sort(range(dic));
dic.erase(unique(range(dic)), dic.end());
vector<int> B(N);
rep(i, N) B[i] = lower_bound(range(dic), A[i]) - dic.begin();
wavelet_matrix<int> wm(B);
vector<pair<int, ll>> C(N);
vector<pair<int, ll>> D(N);
rep(i, N) {
C[i] = make_pair(B[i], A[i]);
D[i] = make_pair(B[i], 1);
}
wavelet_matrix2<ll, 18> wm2(C);
wavelet_matrix2<ll, 18> wm3(D);
while (Q--) {
int l, r; cin >> l >> r; l--;
int q = wm.quantile(l, r, (r - l) / 2);
ll k = wm3.query(l, r, 0, q);
vector<ll> X(A.begin() + l, A.begin() + r);
sort(range(X));
ll ans = 0;
ans += dic[q] * k - wm2.query(l, r, 0, q);
ans += wm2.query(l, r, q, dic.size()) - dic[q] * (r - l - k);
cout << ans << '\n';
}
}