이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#ifdef NON_SUBMIT
#define TEST(n) (n)
#define tout cerr
#else
#define TEST(n) ((void)0)
#define tout cin
#endif
using namespace std;
struct Seg
{
int l, r, v;
Seg() : l(0), r(0), v(0) {}
} tree[5555555];
const int SZ=1<<18;
vector<int> x(1);
vector<pair<int,int>> S;
int node_cnt, tor[2*SZ], lazy[2*SZ], L[2*SZ], R[2*SZ];
void set_tree(int b, int n, int p, int s=0, int e=SZ-1)
{
int m=(s+e)>>1;
if(s==e) {
tree[p].v=1;
return;
}
if(n<=m) {
if(tree[p].l==tree[b].l) tree[tree[p].l=node_cnt++]=tree[tree[b].l];
set_tree(tree[b].l,n,tree[p].l,s,m);
}
else {
if(tree[p].r==tree[b].r) tree[tree[p].r=node_cnt++]=tree[tree[b].r];
set_tree(tree[b].r,n,tree[p].r,m+1,e);
}
tree[p].v=tree[tree[p].l].v+tree[tree[p].r].v;
}
int get_r(int p, int s=0, int e=SZ-1)
{
int m=(s+e)>>1;
if(tree[p].v==0) return -1;
if(s==e) return m;
if(tree[tree[p].r].v) return get_r(tree[p].r,m+1,e);
return get_r(tree[p].l,s,m);
}
int get_sum(int n1, int n2, int p, int s=0, int e=SZ-1)
{
int m=(s+e)>>1;
if(n2<n1 || n2<s || e<n1 || p==0) return 0;
if(n1<=s && e<=n2) return tree[p].v;
return get_sum(n1,n2,tree[p].l,s,m)+get_sum(n1,n2,tree[p].r,m+1,e);
}
void lazy_propagation(int bit, int s, int e)
{
if(lazy[bit]) {
tor[bit]=1;
if(s<e) lazy[2*bit]=lazy[2*bit+1]=1;
lazy[bit]=0;
}
}
void or_tree(int n1, int n2, int bit=1, int s=0, int e=SZ-1)
{
int m=(s+e)>>1;
lazy_propagation(bit,s,e);
if(n2<n1 || n2<s || e<n1) return;
if(n1<=s && e<=n2) {
lazy[bit]=1;
lazy_propagation(bit,s,e);
return;
}
or_tree(n1,n2,2*bit,s,m);
or_tree(n1,n2,2*bit+1,m+1,e);
tor[bit]=tor[2*bit]|tor[2*bit+1];
}
int get_or(int n1, int n2, int bit=1, int s=0, int e=SZ-1)
{
int m=(s+e)>>1;
lazy_propagation(bit,s,e);
if(n2<n1 || n2<s || e<n1) return 0;
if(n1<=s && e<=n2) return tor[bit];
return get_or(n1,n2,2*bit,s,m)|get_or(n1,n2,2*bit+1,m+1,e);
}
int get_lp(int n1, int n2, int bit=1, int s=0, int e=SZ-1)
{
int m=(s+e)>>1, t;
lazy_propagation(bit,s,e);
if(n2<n1 || n2<s || e<n1 || !tor[bit]) return SZ;
if(s==e) return m;
if((t=get_lp(n1,n2,2*bit,s,m))<SZ) return t;
return get_lp(n1,n2,2*bit+1,m+1,e);
}
int get_rp(int n1, int n2, int bit=1, int s=0, int e=SZ-1)
{
int m=(s+e)>>1, t;
lazy_propagation(bit,s,e);
if(n2<n1 || n2<s || e<n1 || !tor[bit]) return -1;
if(s==e) return m;
if((t=get_rp(n1,n2,2*bit+1,m+1,e))>-1) return t;
return get_rp(n1,n2,2*bit,s,m);
}
int get_lv(int n)
{
int ret=L[n+=SZ];
while(n>>=1) ret+=L[n];
return ret;
}
int get_rv(int n)
{
int ret=R[n+=SZ];
while(n>>=1) ret+=R[n];
return ret;
}
void add_lv(int s, int e, int v)
{
for(s+=SZ,e+=SZ;s<=e;s>>=1,e>>=1) {
if(s&1) L[s++]+=v;
if(~e&1) L[e--]+=v;
}
}
void add_rv(int s, int e, int v)
{
for(s+=SZ,e+=SZ;s<=e;s>>=1,e>>=1) {
if(s&1) R[s++]+=v;
if(~e&1) R[e--]+=v;
}
}
void set_lv(int n, int v) {L[n+SZ]+=v-get_lv(n);}
void set_rv(int n, int v) {R[n+SZ]+=v-get_rv(n);}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
TEST(freopen("input.txt","r",stdin));
TEST(freopen("output.txt","w",stdout));
TEST(freopen("debug.txt","w",stderr));
int N, K, cnt=0;
cin>>N>>K; S.resize(N);
for(auto &[l,r]: S) {
cin>>l>>r;
x.push_back(l);
x.push_back(r);
}
sort(x.begin(),x.end()); x.resize(node_cnt=unique(x.begin(),x.end())-x.begin());
memset(R,-1,sizeof(R));
for(int i=0;i<N;i++) {
auto &[l,r]=S[i];
l=lower_bound(x.begin(),x.end(),l)-x.begin();
r=lower_bound(x.begin(),x.end(),r)-x.begin();
R[r]=max(R[r],l);
}
for(int i=1;i<x.size();i++) {
tree[i]=tree[i-1];
if(R[i]>-1 && get_r(i-1)<R[i]) {
tree[i]=tree[R[i]];
set_tree(R[i],R[i],i);
}
}
if(tree[x.size()-1].v<K) {
cout<<"-1\n";
return 0;
}
memset(R,0,sizeof(R));
or_tree(0,0); or_tree(x.size()-1,x.size()-1);
for(int i=0;i<N;i++) {
auto[l,r]=S[i];
if(get_or(l,r-1)) continue;
int s=get_rp(0,l)+1, e=get_lp(r,SZ-1), sv=get_lv(s), ev=get_rv(e), lv=get_sum(s,l,l), rv=get_sum(r,e,e), tv=get_sum(s,e,e);
if(sv+lv+1+rv+ev<K || ++cnt>K) continue;
or_tree(l,r-1);
add_rv(0,s,lv+rv+1-tv); set_rv(l,ev+rv+1);
add_lv(e,SZ-1,lv+rv+1-tv); set_lv(r,sv+lv+1);
cout<<i+1<<'\n';
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
event2.cpp: In function 'int main()':
event2.cpp:167:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
167 | for(int i=1;i<x.size();i++) {
| ~^~~~~~~~~
# | 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... |