結果
| 問題 |
No.924 紲星
|
| コンテスト | |
| ユーザー |
leaf_1415
|
| 提出日時 | 2019-11-08 22:59:58 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,050 bytes |
| コンパイル時間 | 1,405 ms |
| コンパイル使用メモリ | 82,136 KB |
| 実行使用メモリ | 27,272 KB |
| 最終ジャッジ日時 | 2024-09-15 02:08:06 |
| 合計ジャッジ時間 | 7,529 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 5 TLE * 1 -- * 10 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <cmath>
#include <set>
#define llint long long
using namespace std;
typedef pair<llint, llint> P;
typedef pair<P, P> Q;
llint n, Qnum, B;
llint a[200005];
vector<Q> qvec;
llint ans[200005];
multiset<llint> head, tail;
llint hsum, tsum;
vector<llint> lvec, rvec;
void adjust(llint m)
{
while((int)head.size() > (m+1)/2){
auto it = head.end(); it--;
tsum += *it, hsum -= *it;
tail.insert(*it), head.erase(it);
}
while((int)head.size() < (m+1)/2){
hsum += *tail.begin(), tsum -= *tail.begin();
head.insert(*tail.begin()), tail.erase(tail.begin());
}
}
void add(llint x)
{
llint m = head.size() + tail.size();
if(head.size() == 0) head.insert(x), hsum += x;
else{
auto it = head.end(); it--;
if(*it >= x) head.insert(x), hsum += x;
else tail.insert(x), tsum += x;
}
m++;
adjust(m);
}
void erase(llint x)
{
llint m = head.size() + tail.size();
if(head.count(x)) head.erase(head.lower_bound(x)), hsum -= x;
else tail.erase(tail.lower_bound(x)), tsum -= x;
m--;
adjust(m);
}
llint get()
{
auto it = head.end(); it--;
llint med = *it;
llint ret = tsum - med * (llint)tail.size();
ret += med * (llint)head.size() - hsum;
return ret;
}
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> Qnum;
for(int i = 1; i <= n; i++) cin >> a[i];
B = 600;//sqrt(n);
llint l, r;
for(int q = 1; q <= Qnum; q++){
cin >> l >> r;
qvec.push_back(Q(P(l/B, r), P(l, q)));
}
sort(qvec.begin(), qvec.end());
l = qvec[0].second.first, r = qvec[0].first.second;
for(int i = l; i <= r; i++) add(a[i]);
ans[qvec[0].second.second] = get();
for(int i = 1; i < qvec.size(); i++){
llint nl = qvec[i].second.first, nr = qvec[i].first.second;
while(l > nl) l--, add(a[l]);
while(r < nr) r++, add(a[r]);
while(l < nl) erase(a[l]), l++;
while(r > nr) erase(a[r]), r--;
llint qid = qvec[i].second.second;
ans[qid] = get();
}
for(int q = 1; q <= Qnum; q++) cout << ans[q] << "\n";
flush(cout);
return 0;
}
leaf_1415