社区讨论
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 条回复,欢迎继续交流。
正在加载回复...