60pts求调,玄关
  • 板块灌水区
  • 楼主AlanFong
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/3/3 20:15
  • 上次更新2024/3/3 21:46:30
查看原帖
60pts求调,玄关
950390
AlanFong楼主2024/3/3 20:15

60pts,求调

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q,x;
int w[4000005],vis[2000005],re,s[4000005],num[2000005],round1[2000005];
struct node{
    int begin,end,num;
};
node a[2000005];
int chufa[2000005];
signed main()
{
    //freopen("data.in","r",stdin);
    cin>>n>>q>>x;
    for(int i=1;i<=n;i++)
    {
        cin>>w[i];
    }
    int po=1,now,re;
    for(int i=1;i<=n;i++)
    {
        w[i+n]=w[i];
    }
    for(int i=1;i<=2*n;i++)
    {
        s[i]=s[i-1]+w[i];
    }
    for(int i=1;i<=n;i++)
    {
        int l=i,r=2*n;
        int ans=r;
        while(l<=r)
        {
            int mid=(l+r)/2;
            //cout<<"i:"<<i<<" "<<mid<<" ";
            if(s[mid]-s[i-1]>=x)
            {
                //cout<<"OK"<<endl;
                ans=mid;
                r=mid-1;
            }else{
                //cout<<endl;
                l=mid+1;
            }
        }
        chufa[i]=ans%n;
        if(chufa[i]==0)
        {
            chufa[i]=n;
        }
        num[i]=ans-i+1;
    }
    int cnt=1,biao;
    round1[cnt]=1;
    vis[1]=1;
    for(int i=1;i<=n;i++)
    {
        //cout<<chufa[i]<<endl;
    }
    while(1)
    {
        round1[cnt+1]=chufa[round1[cnt]]+1;
        if(round1[cnt+1]==n+1)
        {
            round1[cnt+1]=1;
        }
        cnt++;
        if(vis[round1[cnt]])
        {
            biao=vis[round1[cnt]];
            break;
        }
        vis[round1[cnt]]=cnt;
    }
    cnt--;
    for(int i=1;i<=cnt;i++)
    {
        //cout<<round1[i]<<" "<<num[round1[i]]<<endl;
    }
    //cout<<biao<<endl;
    for(int i=1;i<=q;i++)
    {
        int t;
        cin>>t;
        if(t<=cnt)
        {
            cout<<num[round1[t]]<<endl;
        }
        else{
            int huanjie=cnt-biao+1;
            int now=(t-biao+1)%huanjie+biao-1;
            if((t-biao+1)%huanjie==0)
            {
                now=huanjie+biao-1;
            }
            cout<<num[round1[now]]<<endl;
        }
    }
    return 0;
}
2024/3/3 20:15
加载中...