社区讨论

想问本题二分答案的时间复杂度是否正确

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 条回复,欢迎继续交流。

正在加载回复...