社区讨论

求条

P11619[PumpkinOI Round 1] 种南瓜参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mkl0bmnf
此快照首次捕获于
2026/01/19 18:13
2 个月前
此快照最后确认于
2026/01/23 14:10
2 个月前
查看原帖
马蜂不优良,这是提交记录
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+10;
const ll inf=0x3f3f3f3f3f3f3f3f;
const ll MOD=1e9+7;
ll n,q,x[N],y[N];
struct minsegtree{
	ll tr[4*N],l[4*N],r[4*N],id[N];
	void B(ll u,ll L,ll R){
		tr[u]=inf,l[u]=L,r[u]=R;
		if(L==R){
			id[L]=u;
			return ;
		}
		ll mid=(L+R)/2;
		B(u*2,L,mid),B(u*2+1,mid+1,R);
	}
	void build(){B(1,1,n);}
	void update(ll u){
		if(!u)return ;
		tr[u]=min(tr[u*2],tr[u*2+1]);
		update(u/2);
	}
	void change(ll x,ll val){tr[id[x]]=val;update(id[x]/2);}
	ll Q(ll u,ll L,ll R){
		if(l[u]>=L&&r[u]<=R)return tr[u];
		if(l[u]>R||r[u]<L)return inf;
		return min(Q(u*2,L,R),Q(u*2+1,L,R));
	}
	ll query(ll L,ll R){if(L>R)return inf;return Q(1,L,R);}
}l;
struct maxsegtree{
	ll tr[4*N],l[4*N],r[4*N],id[N];
	void B(ll u,ll L,ll R){
		tr[u]=0,l[u]=L,r[u]=R;
		if(L==R){
			id[L]=u;
			return ;
		}
		ll mid=(L+R)/2;
		B(u*2,L,mid),B(u*2+1,mid+1,R);
	}
	void build(){B(1,1,n);}
	void update(ll u){
		if(!u)return ;
		tr[u]=max(tr[u*2],tr[u*2+1]);
		update(u/2);
	}
	void change(ll x,ll val){tr[id[x]]=val;update(id[x]/2);}
	ll Q(ll u,ll L,ll R){
		if(l[u]>=L&&r[u]<=R)return tr[u];
		if(l[u]>R||r[u]<L)return 0;
		return max(Q(u*2,L,R),Q(u*2+1,L,R));
	}
	ll query(ll L,ll R){if(L>R)return 0LL;return Q(1,L,R);}
}r;
bool ans[N];
ll ls[4*N],rs[4*N];
vector<ll> e[4*N];
void build(ll u,ll L,ll R){
	ls[u]=L,rs[u]=R;
	if(L==R)return ;
	ll mid=(L+R)/2;
	build(u*2,L,mid),build(u*2+1,mid+1,R);
}
void add(ll u,ll L,ll R,ll id){
	if(ls[u]>=L&&rs[u]<=R){
		e[u].push_back(id);
		return ;
	}
	if(ls[u]>R||rs[u]<L)return ;
	add(u*2,L,R,id),add(u*2+1,L,R,id);
}
stack<pair<ll,ll> > lst,rst;
void dfs(ll u,ll sizl,ll sizr){
	bool fl=1;
    for(auto i:e[u]){
        ll mi=l.query(x[i],y[i]-1),ma=r.query(x[i]+1,y[i]);
        if(mi>=x[i]&&ma<=y[i]){
        	if(l.query(y[i],y[i])>x[i])lst.push(make_pair(y[i],l.query(y[i],y[i]))),l.change(y[i],x[i]);
        	if(r.query(x[i],x[i])<y[i])rst.push(make_pair(x[i],r.query(x[i],x[i]))),r.change(x[i],y[i]);
        }else{
        	fl=0;
        	break;
		}
    }
    if(ls[u]==rs[u]){
    	if(fl)ans[ls[u]]=1;
        while(lst.size()-sizl){
            l.change(lst.top().first,lst.top().second);
            lst.pop();
        }
        while(rst.size()-sizr){
        	r.change(rst.top().first,rst.top().second);
            rst.pop();
		}
        return ;
    }
    if(fl)dfs(u*2,lst.size(),rst.size()),dfs(u*2+1,lst.size(),rst.size());
    while(lst.size()-sizl){
        l.change(lst.top().first,lst.top().second);
        lst.pop();
    }
    while(rst.size()-sizr){
       	r.change(rst.top().first,rst.top().second);
        rst.pop();
	}
}
ll vis[N];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>q;
	build(1,1,q);
	for(int i=1;i<=q;i++){
		ll c;
		cin>>c;
		if(c==1)cin>>x[i]>>y[i];
		else{
			ll id;
			cin>>id;
            vis[id]=1;
			add(1,id,i-1,id);
		}
	}
    for(int i=1;i<=q;i++)if(x[i]&&!vis[i])add(1,i,n,i);
    l.build(),r.build();
	dfs(1,0,0);
    for(int i=1;i<=q;i++){
        if(ans[i])cout<<"yes\n";
        else cout<<"no\n";
    }
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...