結果
| 問題 |
No.404 部分門松列
|
| コンテスト | |
| ユーザー |
はまやんはまやん
|
| 提出日時 | 2016-07-22 23:44:17 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,958 bytes |
| コンパイル時間 | 2,160 ms |
| コンパイル使用メモリ | 188,460 KB |
| 実行使用メモリ | 47,628 KB |
| 最終ジャッジ日時 | 2024-11-06 09:30:51 |
| 合計ジャッジ時間 | 17,470 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 WA * 1 |
| other | AC * 1 WA * 30 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
typedef long long ll;
template<class V, int NV> class SegTree {
public:
static V const def = 0;
V comp(V l, V r) { return (l + r); };
vector<V> val;
SegTree() { val = vector<V>(NV * 2, def); }
V getval(int l, int r) { //[l,r]
l += NV; r += NV + 1;
V ret = def;
while (l < r) {
if (l & 1) ret = comp(ret, val[l++]);
if (r & 1) ret = comp(ret, val[--r]);
l /= 2; r /= 2;
}
return ret;
}
void update(int i, V v) {
i += NV;
val[i] = v;
while (i>1) i >>= 1, val[i] = comp(val[i * 2], val[i * 2 + 1]);
}
};
//-----------------------------------------------------------------
int N, Q;
map<int, vector<int> > A;
map<int, ll> cnt;
SegTree<ll, 1 << 20> seg;
#define INF INT_MAX/2
int main()
{
cin >> N;
rep(i, 0, N) {
int a;
scanf("%d", &a);
A[a].push_back(i);
}
rep(i, 0, N) seg.update(i, 1);
for (auto p : A) {
int a = p.first;
auto v = p.second;
for (int i : v) seg.update(i, 0);
for (int i : v) cnt[a] += seg.getval(0, i) * seg.getval(i, N - 1);
}
rep(i, 0, N) seg.update(i, 1);
auto ite = A.rbegin();
while (ite != A.rend()) {
int a = ite->first;
auto v = ite->second;
for (int i : v) seg.update(i, 0);
for (int i : v) cnt[a] += seg.getval(0, i) * seg.getval(i, N - 1);
ite++;
}
/*for (auto p : cnt) {
printf("[%d : %lld]\n", p.first, p.second);
}*/
ll sum = 0;
for (auto p : cnt) {
cnt[p.first] += sum;
sum = cnt[p.first];
}
vector<int> idx;
vector<ll> imos;
idx.push_back(0), imos.push_back(0);
for (auto p : cnt) idx.push_back(p.first), imos.push_back(p.second);
idx.push_back(INF), imos.push_back(sum);
int Q; cin >> Q;
rep(i, 0, Q) {
int L, H; cin >> L >> H;
int LI = lower_bound(idx.begin(), idx.end(), L) - idx.begin();
int HI = upper_bound(idx.begin(), idx.end(), H) - idx.begin();
//printf("<%d %d>", LI, HI);
printf("%lld\n", imos[HI - 1] - imos[LI - 1]);
}
}
はまやんはまやん