結果
| 問題 |
No.3313 Matryoshka
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-01 01:01:34 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,456 ms / 4,000 ms |
| コード長 | 1,473 bytes |
| コンパイル時間 | 3,724 ms |
| コンパイル使用メモリ | 295,024 KB |
| 実行使用メモリ | 21,716 KB |
| 最終ジャッジ日時 | 2025-11-01 01:02:07 |
| 合計ジャッジ時間 | 31,273 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 |
ソースコード
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i <= (b); i ++)
using std::cin, std::cout, std::cerr;
using ll = long long;
int LowBit(int x) { return x & (-x); }
struct BIT {
int n;
std::vector<int> a;
BIT(int n) { Init(n); }
void Init(int n) { this->n = n; a.assign(n + 1, 0); }
void Update(int p, int x) {
for(int i = p + 1; i <= n + 1; i += LowBit(i))
a[i - 1] += x;
}
int Query(int p) {
int r = 0;
for(int i = p + 1; i; i -= LowBit(i))
r += a[i - 1];
return r;
}
};
int main() {
std::ios::sync_with_stdio(false);
int n; cin >> n;
std::vector<std::pair<int, int>> a(n);
rep(i, 0, n - 1) {
int l, r; cin >> l >> r;
a[i] = {l, r};
}
ll ans = 0;
int M = 1e6 + 1;
BIT bit(M);
std::function<void(int, int)> solve = [&](int l, int r) {
if(l + 1 == r) return;
int m = (l + r) / 2;
solve(l, m);
solve(m, r);
std::vector<std::tuple<int, int, int>> b;
rep(i, l, r - 1) b.push_back({a[i].first, a[i].second, i >= m});
std::ranges::sort(b);
for(auto [l, r, t] : b) {
if(t == 0)
bit.Update(r, 1);
else
ans += bit.Query(M) - bit.Query(r);
}
for(auto [l, r, t] : b) {
if(t == 0)
bit.Update(r, -1);
}
};
solve(0, n);
cout << ans << '\n';
}