社区讨论
75pts求调,疑似二分的边界有误
P14378【MX-S9-T1】「LAOI-16」签到参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhqm6i8z
- 此快照首次捕获于
- 2025/11/09 02:24 3 个月前
- 此快照最后确认于
- 2025/11/16 14:08 3 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5,INF=1e18;
int n,k,q,cnt;
int a[N],b[N],c[N],d[N],y[N];
struct Node1 {
int ll,rr,ls,rs;
int maxnq=-INF,minnq=INF,maxnz=-INF,minnz=INF,maxnh=-INF,minnh=INF;
} tr[N<<1];
#define ls tr[u].ls
#define rs tr[u].rs
struct Node2 {
int maxnq,minnq,maxnz,minnz,maxnh,minnh;
};
bool cmp(int a,int b) {
return a>b;
}
void pushup(int u) {
tr[u].maxnq=max(tr[ls].maxnq,tr[rs].maxnq);
tr[u].minnq=min(tr[ls].minnq,tr[rs].minnq);
tr[u].maxnz=max(tr[ls].maxnz,tr[rs].maxnz);
tr[u].minnz=min(tr[ls].minnz,tr[rs].minnz);
tr[u].maxnh=max(tr[ls].maxnh,tr[rs].maxnh);
tr[u].minnh=min(tr[ls].minnh,tr[rs].minnh);
}
void f(Node2 &a,Node2 b) {
a.maxnq=max(a.maxnq,b.maxnq);
a.minnq=min(a.minnq,b.minnq);
a.maxnz=max(a.maxnz,b.maxnz);
a.minnz=min(a.minnz,b.minnz);
a.maxnh=max(a.maxnh,b.maxnh);
a.minnh=min(a.minnh,b.minnh);
}
void build(int &u,int l,int r) {
u=++cnt;
tr[u].ll=l,tr[u].rr=r;
if(l==r) {
if(l>1)tr[u].maxnq=tr[u].minnq=a[l]+d[l-1];
if(l<n)tr[u].maxnh=tr[u].minnh=a[l]+d[l+1];
tr[u].maxnz=tr[u].minnz=a[l]+d[l];
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(u);
}
Node2 qry(int u,int l,int r) {
if(tr[u].ll>=l&&tr[u].rr<=r) {
Node2 res= {tr[u].maxnq,tr[u].minnq,tr[u].maxnz,tr[u].minnz,tr[u].maxnh,tr[u].minnh};
return res;
}
int mid=(tr[u].ll+tr[u].rr)>>1;
Node2 ans= {-INF,INF,-INF,INF,-INF,INF};
if(l<=mid)f(ans,qry(ls,l,r));
if(r>mid)f(ans,qry(rs,l,r));
return ans;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>k>>q;
for(int i=1; i<=n; i++) {
cin>>a[i];
y[i]=a[i];
}
for(int i=1; i<=k; i++)cin>>b[i];
for(int i=1; i<=k; i++)cin>>c[i];
sort(a+1,a+n+1);
for(int i=1; i<=k; i++) {
while(b[i]--)d[++cnt]=c[i];
}
sort(d+1,d+n+1,cmp);
cnt=0;
int t=1;
build(t,1,n);
while(q--) {
int u,v;
cin>>u>>v;
int val=y[u];
if(v>=val) { //[w1+1,w2]
int w1=lower_bound(a+1,a+n+1,val)-a;
int w2=upper_bound(a+1,a+n+1,v)-a-1;
int maxn=-INF,minn=INF;
maxn=max(maxn,v+d[w2]);
minn=min(minn,v+d[w2]);
if(w1>1) {
Node2 ans1=qry(1,1,w1);
maxn=max(maxn,ans1.maxnz);
minn=min(minn,ans1.minnz);
}
if(w1<w2) {
Node2 ans2=qry(1,w1+1,w2);
maxn=max(maxn,ans2.maxnq);
minn=min(minn,ans2.minnq);
}
if(w2<n) {
Node2 ans3=qry(1,w2+1,n);
maxn=max(maxn,ans3.maxnz);
minn=min(minn,ans3.minnz);
}
cout<<maxn-minn<<"\n";
} else { //[w2,w1-1]
int w1=upper_bound(a+1,a+n+1,val)-a-1;
int w2=lower_bound(a+1,a+n+1,v)-a;
int maxn=-INF,minn=INF;
maxn=max(maxn,v+d[w2]);
minn=min(minn,v+d[w2]);
if(w2>1) {
Node2 ans1=qry(1,1,w2-1);
maxn=max(maxn,ans1.maxnz);
minn=min(minn,ans1.minnz);
}
if(w2<w1) {
Node2 ans2=qry(1,w2,w1-1);
maxn=max(maxn,ans2.maxnh);
minn=min(minn,ans2.minnh);
}
if(w1<n) {
Node2 ans3=qry(1,w1,n);
maxn=max(maxn,ans3.maxnz);
minn=min(minn,ans3.minnz);
}
cout<<maxn-minn<<"\n";
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...