线段树 求调最后两个点WA
查看原帖
线段树 求调最后两个点WA
1166193
23HKR楼主2024/6/6 01:57
#include<bits/stdc++.h>
#define lc u<<1
#define rc u<<1|1
using namespace std;
using ll = long long;
using pii = pair<int,int>;
const int N = 1e6+5;
int t,n,m,k,l,r,op,x,y,ml=N,mr=0,spe=N<<2;
int cons1[N<<3],cons0[N<<3];
int le1[N<<3],le0[N<<3];
int ri1[N<<3],ri0[N<<3];
int len[N<<3],tag[N<<3];
bool flag;
void fill(int u,bool op){
	cons1[u]=le1[u]=ri1[u]=op?len[u]:0;
	cons0[u]=le0[u]=ri0[u]=op?0:len[u];
}
void push_down(int u){
	if(tag[u]){
		fill(lc,1);
		fill(rc,1);
		tag[lc]^=1;
		tag[rc]^=1;
		tag[u]=0;
	}
}
void push_up(int u,int lcc,int rcc){
	cons1[u] = max(max(cons1[lcc],cons1[rcc]),ri1[lcc]+le1[rcc]);
	le1[u] = le1[lcc]+((le1[lcc]==len[lcc])?le1[rcc]:0);
	ri1[u] = ri1[rcc]+((ri1[rcc]==len[rcc])?ri1[lcc]:0);
	
	cons0[u] = max(max(cons0[lcc],cons0[rcc]),ri0[lcc]+le0[rcc]);
	le0[u] = le0[lcc]+((le0[lcc]==len[lcc])?le0[rcc]:0);
	ri0[u] = ri0[rcc]+((ri0[rcc]==len[rcc])?ri0[lcc]:0);
}
void push_up(int u){
	push_up(u,lc,rc);
}
void build(int u,int l,int r){
	len[u] = r-l+1;
	if(l==r){
		fill(u,0);
		return;
	}
	int m = (l+r)>>1;
	build(lc,l,m);
	build(rc,m+1,r);
	push_up(u);
}
void update(int u,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr){
		tag[u]=1;
		fill(u,1);
		return;
	}
	push_down(u);
	int m = (l+r)>>1;
	if(qr<=m) update(lc,l,m,ql,qr);
	else if(ql>m) update(rc,m+1,r,ql,qr);
	else update(lc,l,m,ql,m),update(rc,m+1,r,m+1,qr);
	push_up(u);
}
int query(int u,int l,int r,int ql,int qr){
//	cout<<l<<" "<<r<<" "<<cons1[u]<<"\n";
	if(ql<=l&&r<=qr){
		return u;
	}
	push_down(u);
	int m = (l+r)>>1;
	if(qr<=m) return query(lc,l,m,ql,qr);
	else if(ql>m) return query(rc,m+1,r,ql,qr);
	else {
		int tl = query(lc,l,m,ql,m);
		int tr = query(rc,m+1,r,m+1,qr);
		spe++;
		push_up(spe,tl,tr);
		return spe;
	}
}
int query1cnt(int u,int l,int r,int ql,int qr){
	return cons1[query(u,l,r,ql,qr)];
}
int query0cnt(int u,int l,int r,int ql,int qr){
	return cons0[query(u,l,r,ql,qr)];
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);	
	cin>>n;
	build(1,1,N);
	for(int i = 1;i<=n;i++){
		cin>>l>>r;
		r-=0;
		l+=1;
//		r-=1;
		ml = min(ml,l);
		mr = max(mr,r);
		update(1,1,N,l,r);
	}
//	cout<<"l:"<<ml<<",r:"<<mr<<"\n";
	cout<<query1cnt(1,1,N,ml,mr)<<" "<<query0cnt(1,1,N,ml,mr);
	return 0;
}
2024/6/6 01:57
加载中...