玄关求卡常 TLE#21
查看原帖
玄关求卡常 TLE#21
1286553
doooge楼主2025/7/25 15:01

玄关求卡常,另问为什么会被卡

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define ls(x) (lson[x]?lson[x]:lson[x]=++cnt)
#define rs(x) (rson[x]?rson[x]:rson[x]=++cnt)
using namespace std;
int t[15000010],lson[15000010],tag[15000010],rson[15000010],cnt=1;
void pushup(int x){
	t[x]=t[ls(x)]+t[rs(x)];
//	cout<<x<<' '<<ls(x)<<' '<<rs(x)<<' '<<t[ls(x)]<<' '<<t[rs(x)]<<' '<<t[x]<<endl;
}
void pushdown(int fa,int l,int r){
//	cout<<"pushdown:"<<tag[fa]<<endl;
	if(tag[fa]==-1)return;
//	cout<<fa<<endl;
	int mid=(l+r)>>1;
	tag[ls(fa)]=tag[fa];
	t[ls(fa)]=(mid-l+1)*tag[fa];
	tag[rs(fa)]=tag[fa];
	t[rs(fa)]=(r-mid)*tag[fa];
	tag[fa]=-1;
	return;
}
int query(int l,int r,int L,int R,int fa){
//	cout<<"query:"<<L<<' '<<R<<' '<<fa<<' '<<t[fa]<<endl;
	if(L>=l&&R<=r){
		return t[fa];
	}
	pushdown(fa,L,R);
	int mid=(L+R)>>1,ans=0;
	if(l<=mid)ans+=query(l,r,L,mid,ls(fa));
	if(r>mid)ans+=query(l,r,mid+1,R,rs(fa));
	return ans;
}
void update(int l,int r,int L,int R,int fa,int op){
//	cout<<"update:"<<L<<' '<<R<<' '<<fa<<' '<<op;
	if(L>=l&&R<=r){
		t[fa]=(R-L+1)*op;
		tag[fa]=op;
//		cout<<t[fa]<<endl;
		return;
	}
//	cout<<endl;
	pushdown(fa,L,R);
	int mid=(L+R)>>1,ans=0;
	if(l<=mid)update(l,r,L,mid,ls(fa),op);
	if(r>mid)update(l,r,mid+1,R,rs(fa),op);
	pushup(fa);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int n,q;
	cin>>n>>q;
	fill(tag,tag+int(1.5e7)+1,-1);
	for(int i=1;i<=q;i++){
		int x,y,k;
		cin>>x>>y>>k;
		update(x,y,1,n,1,(k==2?0:1));
		cout<<n-query(1,n,1,n,1)<<'\n';
	}
	return 0;
}
2025/7/25 15:01
加载中...