結果
| 問題 |
No.2220 Range Insert & Point Mex
|
| コンテスト | |
| ユーザー |
ぷら
|
| 提出日時 | 2023-01-31 04:23:41 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,461 ms / 2,000 ms |
| コード長 | 3,403 bytes |
| コンパイル時間 | 2,289 ms |
| コンパイル使用メモリ | 218,384 KB |
| 最終ジャッジ日時 | 2025-02-10 07:53:26 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 36 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct BinaryIndexedTree {
int N;
vector<T>bit;
BinaryIndexedTree(){}
BinaryIndexedTree(int x) {
N = x;
bit.resize(x+1);
}
void add(int x,T y) {
x++;
while(x <= N) {
bit[x] += y;
x += x&-x;
}
}
T sum(int x) {
x++;
T res = 0;
while(x) {
res += bit[x];
x -= x&-x;
}
return res;
}
inline T sum(int l, int r) {//[l,r)
return sum(r-1)-sum(l-1);
}
inline T operator[](int k) {
return sum(k)-sum(k-1);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
vector<int>L(N),R(N),a(N),cmp;
for(int i = 0; i < N; i++) {
cin >> L[i] >> R[i] >> a[i];
cmp.push_back(L[i]);
cmp.push_back(R[i]+1);
}
int Q;
cin >> Q;
vector<int>x(Q);
for(int i = 0; i < Q; i++) {
cin >> x[i];
cmp.push_back(x[i]);
}
sort(cmp.begin(),cmp.end());
cmp.erase(unique(cmp.begin(),cmp.end()),cmp.end());
for(int i = 0; i < N; i++) {
L[i] = lower_bound(cmp.begin(),cmp.end(),L[i])-cmp.begin();
R[i] = lower_bound(cmp.begin(),cmp.end(),R[i]+1)-cmp.begin();
}
for(int i = 0; i < Q; i++) {
x[i] = lower_bound(cmp.begin(),cmp.end(),x[i])-cmp.begin();
}
vector<int>l(Q),r(Q,N+3);
while(true) {
bool flag = false;
for(int i = 0; i < Q; i++) {
if(l[i]+1 < r[i]) {
flag = true;
}
}
if(!flag) break;
map<int,vector<pair<int,int>>>mp;
for(int i = 0; i < N; i++) {
mp[a[i]].push_back({L[i],R[i]});
}
for(int i = 0; i < Q; i++) {
if(l[i]+1 < r[i]) {
int mid = (l[i]+r[i])/2;
mp[mid].push_back({i,-1});
}
}
BinaryIndexedTree<int>bit(cmp.size());
for(auto i:mp) {
auto j = i.second;
vector<pair<int,int>>tmp;
for(auto k:j) {
if(k.second != -1) {
tmp.push_back(k);
}
else {
if(bit.sum(x[k.first]) == i.first) {
l[k.first] = i.first;
}
else {
r[k.first] = i.first;
}
}
}
sort(tmp.begin(),tmp.end());
vector<pair<int,int>>res;
int mi = -1,mx = -1;
for(int k = 0; k < tmp.size(); k++) {
if(mx == -1) {
mi = tmp[k].first;
mx = tmp[k].second;
}
else if(mx <= tmp[k].first) {
res.push_back({mi,mx});
mi = tmp[k].first;
mx = tmp[k].second;
}
else {
mx = max(mx,tmp[k].second);
}
}
if(mi != -1) {
res.push_back({mi,mx});
}
for(int k = 0; k < res.size(); k++) {
bit.add(res[k].first,1);
bit.add(res[k].second,-1);
}
}
}
for(int i = 0; i < Q; i++) {
cout << l[i] << "\n";
}
}
ぷら