社区讨论

3个线段树写法WA玄关求调

P14378【MX-S9-T1】「LAOI-16」签到参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhqm6fum
此快照首次捕获于
2025/11/09 02:24
4 个月前
此快照最后确认于
2025/11/16 14:08
4 个月前
查看原帖
后4个大样例超时,第五个大样例没过
正常做法,只是把st表换成线段树就炸了
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+1e1;
int n,k,T;
int now[maxn],yuan[maxn];
struct node{
	int w,sum; 
};
node e[maxn];
int max1,min1;
struct node1{
	int da,xiao;
};
node1 a[maxn*4][5];//偏序线段树 
int add[maxn],cnt;
bool cmp(node x,node y){
	return x.w>y.w;
}
int lc(int x){return 2*x;}
int rc(int x){return 2*x+1;}
void pushup_pian(int x,int flag){
	a[x][flag].da=max(a[lc(x)][flag].da,a[rc(x)][flag].da);
	a[x][flag].xiao=min(a[lc(x)][flag].xiao,a[rc(x)][flag].xiao);
	return ;
}
void buildpian(int rt,int l,int r,int flag){
	if(l==r){
		if(flag==1)
			a[rt][flag].da=a[rt][flag].xiao=now[l]+add[l]; 
		else if(flag==2)
			a[rt][flag].da=a[rt][flag].xiao=now[l+1]+add[l]; 
		else 
			a[rt][flag].da=a[rt][flag].xiao=now[l-1]+add[l]; 			
		return ;
	}
	int mid=(l+r)/2;
	buildpian(lc(rt),l,mid,flag);
	buildpian(rc(rt),mid+1,r,flag);
	pushup_pian(rt,flag);
	return ;
}
void cha(int rt,int l,int r,int ql,int qr,int flag){
	if(ql<=l&&r<=qr){
		max1=max(max1,a[rt][flag].da);
		min1=min(min1,a[rt][flag].xiao);
		return ;
	}
	int mid=(l+r)/2;
	if(mid>=ql) cha(lc(rt),l,mid,ql,qr,flag);
	if(mid+1<=qr) cha(rc(rt),mid+1,r,ql,qr,flag);
	return ;
}
int in(){
    int k=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
    return k*f; 
}
void out(int x){
    if(x<0)putchar('-'),x=-x;
    if(x<10)putchar(x+'0');
    else out(x/10),putchar(x%10+'0');
}
int main(){
//	freopen("register.in","r",stdin);
//	freopen("register.out","w",stdout);
	n=in(),k=in(),T=in();
	for(int i=1;i<=n;i++){
		now[i]=in();
		yuan[i]=now[i];
	}
	for(int i=1;i<=k;i++)
		e[i].sum=in();
	for(int i=1;i<=k;i++)
		e[i].w=in();
	sort(e+1,e+k+1,cmp);
	for(int i=1;i<=k;i++)
		for(int j=1;j<=e[i].sum;j++)
			add[++cnt]=e[i].w;
	sort(now+1,now+n+1);
	buildpian(1,1,n,1);
	buildpian(1,1,n,2);//左移 
	buildpian(1,1,n,3);//右移 
	while(T--){
		int x,y;
		x=in(),y=in();
		int p1=lower_bound(now+1,now+n+1,yuan[x])-now,p2=lower_bound(now+1,now+n+1,y)-now;
		max1=0;
		min1=maxn*2;
		if(p1<p2){
			cha(1,1,n,p1,p2-1,2);
			if(p1-1!=0)
				cha(1,1,n,1,p1-1,1);
			if(p2+1<=n)
				cha(1,1,n,p2+1,n,1);
		}
		else {
			cha(1,1,n,p2+1,p1,3);
			if(p2-1!=0)
				cha(1,1,n,1,p2-1,1);
			if(p1+1<=n)
				cha(1,1,n,p1+1,n,1);
		}
		max1=max(max1,y+add[p2]);
		min1=min(min1,y+add[p2]);
		out(max1-min1);
		putchar('\n');
	}
	return 0;
}

回复

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

正在加载回复...