이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5;
const int logN = 20;
const int inf = 2e9;
vector <int> ans;
struct range{
int l,r,id;
}v[N];
int p[N];
int jump[N][logN];
int mx[N][logN];
int query(int l, int r){
int nr = 31 - __builtin_clz(r - l + 1);
return max(mx[l][nr],mx[r - (1<<nr) + 1][nr]);
}
int n,k;
int calc(int ql,int qr){
int l = 0,r = n;
while(l != r){
int mij = (l + r)/2;
if(query(0,mij) >= ql){
r = mij;
}else l = mij + 1;
}
//cout<<"calc:"<<ql<<' '<<qr<<' ';
if(l == n || v[l].r > qr){
//cout<<0<<'\n';
return 0;
}
int ans = 1;
for(int i = logN - 1;i >= 0;i--){
if(jump[l][i] != n && v[jump[l][i]].r <= qr){
ans+=(1<<i);
l = jump[l][i];
}
}
//cout<<ans<<'\n';
return ans;
}
map <int,int> segments;
int main(){
cin>>n>>k;
for(int i = 0;i < n;i++){
cin>>v[i].l>>v[i].r;
v[i].r--;
v[i].id = i;
}
sort(v, v + n, [&](range a,range b){
return a.r < b.r;
});
for(int i = 0;i < n;i++){
p[v[i].id] = i;
mx[i][0] = v[i].l;
}
for(int j = 1;j < logN;j++){
for(int i = 0;i < n - (1<<j) + 1;i++){
mx[i][j] = max(mx[i][j - 1],mx[i + (1<<(j - 1))][j - 1]);
}
}
for(int i = 0;i < n;i++){
int l = i + 1,r = n;
while(l != r){
int mij = (l + r)/2;
if(query(0,mij) > v[i].r){
r = mij;
}else l = mij + 1;
}
jump[i][0] = l;
}
for(int j = 1;j < logN;j++){
for(int i = 0;i < n;i++){
if(jump[i][j - 1] == n)jump[i][j] = n;
else jump[i][j] = jump[jump[i][j - 1]][j - 1];
}
}
segments[0] = 0;
segments[inf] = inf;
int cur = calc(0,inf);
for(int i = 0;i < n;i++){
int id = p[i];
//cout<<v[id].l<<' '<<v[id].r<<' '<<cur<<'\n';
auto it = segments.lower_bound(v[id].l);
bool ok = 1;
if(prev(it)->second >= v[id].l){
ok = 0;
}
if(it->first <= v[id].r){
ok = 0;
}
if(!ok)continue;
int sv = cur;
cur-=calc(prev(it)->second + 1,it->first - 1);
cur+=calc(prev(it)->second + 1,v[id].l - 1);
cur+=calc(v[id].r + 1,it->first - 1);
cur++;
//cout<<"consideration:"<<sv<<' '<<cur<<' '<<i<<'\n';
if(cur >= k){
//cout<<"add\n";
ans.push_back(i + 1);
segments[v[id].l] = v[id].r;
}else cur = sv;
}
if(ans.size() >= k){
for(int i = 0;i < k;i++){
cout<<ans[i]<<'\n';
}
}else cout<<-1<<'\n';
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
event2.cpp: In function 'int main()':
event2.cpp:104:19: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
104 | if(ans.size() >= k){
| ~~~~~~~~~~~^~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |