离散化+线段树 球条
查看原帖
离散化+线段树 球条
818000
xxmb楼主2024/6/29 08:34

shishan 代码球条
TLE on #36 #37 #38

#include<bits/stdc++.h>
#define int long long
using namespace std;
int read() {
    int x=0; char c=0; while(!isdigit(c)) c=getchar();
    while(isdigit(c)) x=(x<<3)+(x<<1)+(c&15),c=getchar();
    return x;
}
int n,m,k,op[201000],x[201000],res[201000];
struct node{
	int l,r,sum,lval,rval,ok;
}mp[801000];
int b[201000];
void pushup(int op){
	mp[op].lval=(mp[op<<1].lval?mp[op<<1].lval:mp[op<<1|1].lval);
	mp[op].rval=(mp[op<<1|1].rval?mp[op<<1|1].rval:mp[op<<1].rval);
	mp[op].ok=mp[op<<1].ok&&mp[op<<1|1].ok&&(!mp[op<<1].sum||!mp[op<<1|1].sum||mp[op<<1|1].lval-mp[op<<1].lval<=k);
	mp[op].sum=mp[op<<1].sum+mp[op<<1|1].sum; 
}
void build(int op,int l,int r){
	mp[op].l=l,mp[op].r=r,mp[op].ok=1;
	if(l==r)
		return ;
	int mid=mp[op].l+mp[op].r>>1;
	build(op<<1,l,mid);
	build(op<<1|1,mid+1,r);
	pushup(op);
}
void change(int op,int x,int val){
	if(mp[op].l==mp[op].r){
		if(!mp[op].sum){
			mp[op].lval=mp[op].rval=val;
			mp[op].sum=1;
		}
		else
			mp[op].lval=mp[op].rval=mp[op].sum=0;
		return ;
	}
	int mid=mp[op].l+mp[op].r>>1;
	if(x<=mid)
		change(op<<1,x,val);
	else	change(op<<1|1,x,val);
	pushup(op);
}
node ask(int op,int x){
	if(mp[op].ok)
		return mp[op];
	int mid=mp[op].l+mp[op].r>>1;
	node ans;
	if(x<=mid){
		ans=ask(op<<1,x);
		if(mp[op<<1|1].sum&&mp[op<<1|1].lval-ans.rval<=k){
			node rson=ask(op<<1|1,x); 
			ans.sum+=rson.sum;
			ans.rval=rson.rval;
		}
	}
	else{
		ans=ask(op<<1|1,x);
		if(mp[op<<1].sum&&ans.lval-mp[op<<1].rval<=k){
			node lson=ask(op<<1,x);
			ans.sum+=lson.sum;
			ans.lval=lson.lval; 
		}
	}
	return ans;
}
signed main(){
	n=read(),k=read();
	for(int i=1;i<=n;i++){
		op[i]=read();
		b[i]=x[i]=read();
	}
	sort(b+1,b+n+1);
	m=unique(b+1,b+n+1)-b-1;
	build(1,1,m);
	for(int i=1;i<=n;i++)
		res[i]=lower_bound(b+1,b+m+1,x[i])-b;
	for(int i=1;i<=n;i++)
		if(op[i]==1)
			change(1,res[i],x[i]);
		else
			cout<<ask(1,res[i]).sum<<"\n";
	return 0;
}
2024/6/29 08:34
加载中...