結果
| 問題 |
No.924 紲星
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-11-02 20:38:50 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 985 ms / 4,000 ms |
| コード長 | 2,037 bytes |
| コンパイル時間 | 4,518 ms |
| コンパイル使用メモリ | 263,648 KB |
| 最終ジャッジ日時 | 2025-02-25 02:08:47 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 16 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int N, Q;
cin >> N >> Q;
vector<int> a(N), c;
for(auto &&v : a) cin >> v;
c = a;
sort(c.begin(), c.end());
c.erase(unique(c.begin(), c.end()), c.end());
int m = c.size();
vector<vector<int>> tb(m);
for(int i = 0; i < N; i++){
int p = lower_bound(c.begin(), c.end(), a[i]) - c.begin();
tb[p].emplace_back(i);
}
vector<pair<int,int>> query(Q);
vector<int> ng(Q, -1), ok(Q, m);
vector<internal::simple_queue<int>> que(m);
for(auto &&[l, r] : query){
cin >> l >> r;
l--;
}
for(int i = 0; i < Q; i++) que[m / 2].push(i);
for(int i = 0; i < 18; i++){
fenwick_tree<int> fw(N);
for(int j = 0; j < m; j++){
for(auto p : tb[j]) fw.add(p, 1);
while(!que[j].empty()){
auto qi = que[j].front();
que[j].pop();
auto [l, r] = query[qi];
if(fw.sum(l, r) >= (r - l + 1) / 2){
ok[qi] = j;
}else{
ng[qi] = j;
}
if(ng[qi] + 1 < ok[qi]){
int mid = (ok[qi] + ng[qi]) / 2;
que[mid].push(qi);
}
}
}
}
for(int i = 0; i < Q; i++) que[ok[i]].push(i);
fenwick_tree<int> fw(N);
fenwick_tree<ll> fw2(N);
for(int i = 0; i < N; i++){
fw.add(i, -1);
fw2.add(i, a[i]);
}
vector<ll> ans(Q);
for(int i = 0; i < m; i++){
for(auto p : tb[i]){
fw2.add(p, -2 * a[p]);
fw.add(p, 2);
}
while(!que[i].empty()){
auto qi = que[i].front();
que[i].pop();
auto [l, r] = query[qi];
ans[qi] = fw2.sum(l, r) + (ll)c[i] * fw.sum(l, r);
}
}
for(auto &&v : ans) cout << v << '\n';
}