题目链接:Codeforces - Turn Off The TV
直接暴力。线段树区间暴力赋值。然后看每个区间min是否大于2
因为区间很大,所以动态开点即可。
需要注意的是,因为我们是区间修改,会传递lazy,所以每次必须先开点。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+10;
int n,l[N],r[N],up=1e9+1;
int mi[N*60],lazy[N*60],lc[N*60],rc[N*60],rt=1,cnt=1;
char *fs,*ft,buf[1<<15];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
inline int read(){
int x=0,f=1; char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;
}
inline void push_up(int p){mi[p]=min(mi[lc[p]],mi[rc[p]]);}
inline void push_down(int p){
if(!lazy[p]) return ;
lazy[lc[p]]+=lazy[p],lazy[rc[p]]+=lazy[p];
mi[lc[p]]+=lazy[p],mi[rc[p]]+=lazy[p];
lazy[p]=0;
}
void change(int p,int l,int r,int ql,int qr){
if(l==ql&&r==qr){mi[p]++; lazy[p]++; return ;}
if(!lc[p]&&!rc[p]) lc[p]=++cnt,rc[p]=++cnt;
int mid=l+r>>1; push_down(p);
if(qr<=mid) change(lc[p],l,mid,ql,qr);
else if(ql>mid) change(rc[p],mid+1,r,ql,qr);
else change(lc[p],l,mid,ql,mid),change(rc[p],mid+1,r,mid+1,qr);
push_up(p);
}
int ask(int p,int l,int r,int ql,int qr){
if(l==ql&&r==qr) return mi[p];
int mid=l+r>>1; push_down(p);
if(qr<=mid) return ask(lc[p],l,mid,ql,qr);
else if(ql>mid) return ask(rc[p],mid+1,r,ql,qr);
else return min(ask(lc[p],l,mid,ql,mid),ask(rc[p],mid+1,r,mid+1,qr));
}
signed main(){
n=read();
for(int i=1;i<=n;i++)
l[i]=read(),r[i]=read(),change(rt,1,up,l[i]+1,r[i]+1);
for(int i=1;i<=n;i++) if(ask(rt,1,up,l[i]+1,r[i]+1)>=2) return cout<<i,0;
puts("-1");
return 0;
}