85pts求调(玄关)
查看原帖
85pts求调(玄关)
1038710
AutumnQ楼主2023/11/25 21:48

记录

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
    ll dis;
    ll a;
    ll z;
}k[100001];
ll n,d;
ll ans=0;
ll rank1[100001];
ll diss[100001];
ll yx=0;
bool cmp(const node &a,const node &b){
    if(a.a==b.a)return a.z<b.z;
    return a.a<b.a;
}
int main(){
    scanf("%d%d",&n,&d);
    for(int i=1;i<n;i++){
        scanf("%lld",&k[i].dis);
        diss[i]=diss[i-1]+k[i].dis;
    }
    for(int i=1;i<=n;i++){
        scanf("%lld",&k[i].a);
        k[i].z=i;
    }
    sort(k+1,k+n,cmp);
    if(k[1].z==1){
        for(int i=1;i<n;i++){
            ans+=k[i].dis;
        }
        ans=(ans%d==0)?ans/d+1:ans/d;
        printf("%d",ans);
        return 0;
    }
    for(int i=1;i<=n;i++){
        rank1[k[i].z]=i;
    }
    int flg1=1;
    int flg2=1;
    while(flg1<n){
        flg2=flg1;
        do{
            flg2++;
        }
        while(rank1[flg2]>rank1[flg1]);
        if(flg2>n)flg2=n;
        if(flg2==flg1)flg2=flg1+1;
        if(yx+(diss[flg2-1]-diss[flg1-1])/d*d>=(diss[flg2-1]-diss[flg1-1])){
            yx=yx+(diss[flg2-1]-diss[flg1-1])/d*d;
            yx-=(diss[flg2-1]-diss[flg1-1]);
            ans=ans+((diss[flg2-1]-diss[flg1-1])/d)*k[rank1[flg1]].a;
        }else{
            yx=yx+((diss[flg2-1]-diss[flg1-1])/d+1)*d;
            yx-=(diss[flg2-1]-diss[flg1-1]);
            ans=ans+((diss[flg2-1]-diss[flg1-1])/d+1)*k[rank1[flg1]].a;
        }
        flg1=flg2;
    }
    printf("%lld",ans);
    return 0;
}


2023/11/25 21:48
加载中...