Codeforces - Turn Off The TV

题目链接: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;
}
发布了604 篇原创文章 · 获赞 242 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104364461