社区讨论
想问本题二分答案的时间复杂度是否正确
P14507缺零分治 mexdnc参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mi0veh9u
- 此快照首次捕获于
- 2025/11/16 06:40 4 个月前
- 此快照最后确认于
- 2025/11/16 13:38 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int T,n,q,a[N],b[N];
long long m;
inline int read()
{
int s = 0,w = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-')w = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
s = s * 10 + ch - '0';
ch = getchar();
}
return s * w;
}
inline long long check(int x){
long long cnt=0ll;
int now=x;
for(int i=1;i<=n;i++){
if(i==1){
if(a[i]==0){
if(b[i]>=now){
continue;
}
else{
cnt=cnt+((long long)now-(long long)b[i])*(long long)a[i];
now=b[i];
}
}
else{
cnt=cnt+(long long)now*(long long)(0);
now=0;
break;
}
}
else if(a[i]==a[i-1]+1){
if(b[i]>=now){
continue;
}
else{
cnt=cnt+((long long)now-(long long)b[i])*(long long)a[i];
now=b[i];
}
}
else{
cnt=cnt+(long long)now*(long long)(a[i-1]+1);
now=0;
break;
}
}
if(now!=0){
cnt=cnt+(long long)now*(long long)(a[n]+1);
now=0;
}
return cnt;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
T=read();
while(T--){
n=read();
q=read();
long long sum=0ll;
int flag=0;
for(int i=1;i<=n;i++){
a[i]=read();
b[i]=read();
if(a[i]==0) flag=1;
sum=sum+(long long)b[i];
}
while(q--){
int ans=1e9+1;
scanf("%lld",&m);
int L=1,R;
if(sum>1e9){
R=1e9;
}
else R=sum;
while(L<=R){
int mid=(L+R)/2;
long long tmp=check(mid);
if(tmp<m){
L=mid+1;
}
else{
if(mid==1){
if(tmp==m){
ans=min(ans,mid);
R=mid-1;
}
else L=mid+1;
}
else{
if(flag&&m>=1){
ans=min(ans,mid);
R=mid-1;
}
else if(!flag&&m>=0){
ans=min(ans,mid);
R=mid-1;
}
else L=mid+1;
}
}
}
if(L>=1){
long long tmp=check(L);
if(L==1&&tmp==m) ans=min(ans,L);
else if(L!=1&&m>=flag&&m<=tmp) ans=min(ans,L);
}
if(R>=1){
long long tmp=check(R);
if(R==1&&tmp==m) ans=min(ans,R);
else if(R!=1&&m>=flag&&m<=tmp) ans=min(ans,R);
}
if(ans==1e9+1) printf("-1\n");
else printf("%d",ans);
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...