社区讨论
40pts 玄关求条/HACK
P14507缺零分治 mexdnc参与者 1已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi0vam3s
- 此快照首次捕获于
- 2025/11/16 06:37 3 个月前
- 此快照最后确认于
- 2025/11/17 09:11 3 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,Inf=2e9;
int t,n,q;
int gs[N];
int a,b,lst,cnt,lm;
long long m;
struct seq {
int id;
long long mn,sm;
} mx[N];
int main() {
cin>>t;
while(t--) {
cin>>n>>q;
lst=-1,gs[0]=Inf,lm=n;
for(int i=1;i<=n;i++) {
cin>>a>>b;
if(a!=lst+1) gs[i]=0,lm=i-1;
else gs[i]=min(gs[i-1],b);
lst=a;
}
int pos=n;
cnt=0;
while(pos!=0) {
while(gs[pos]==gs[pos+1]) pos--;
if(pos==0) break;
mx[++cnt].id=pos;
mx[cnt].mn=gs[pos+1];
mx[cnt].sm=mx[cnt-1].sm+1ll*pos*(gs[pos]-gs[pos+1]);
pos--;
}
for(int i=1;i<=q;i++) {
cin>>m;
if(m==0) {
if(gs[1]!=0) cout<<-1<<endl;
else cout<<1<<endl;
continue;
}
if(m<lm) {
cout<<2<<endl;
continue;
}
int l=1,r=cnt,mid,res=-1;
while(l<=r) {
mid=(l+r)/2;
if(mx[mid].sm>=m) res=mid,r=mid-1;
else l=mid+1;
}
if(res==-1) {
cout<<-1<<endl;
continue;
}
mid=res;
m-=mx[mid-1].sm;
res=mx[mid].mn+m/mx[mid].id;
if(m%mx[mid].id) res++;
cout<<res<<endl;
}
}
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...