Logo Wy Online Judge

WyOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#36#205#7. 「WyOJ Round 1」归 · 星穗垂野__vector____vector__Failed.2025-04-18 08:32:332025-04-18 08:32:35

详细

Extra Test:

Invalid Input

input:

1 114
14
51

output:


result:

FAIL Expected EOLN (stdin)

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#205#7. 「WyOJ Round 1」归 · 星穗垂野__vector__1005394ms214220kbC++235.6kb2025-04-18 08:32:072025-04-18 20:49:15

answer

#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(auto i=(a);i<=(b);i++)
#define REP(i,a,b) for(auto i=(a);i>=(b);i--)
#define FORK(i,a,b,k) for(auto i=(a);i<=(b);i+=(k))
#define REPK(i,a,b,k) for(auto i=(a);i>=(b);i-=(k))
#define pb push_back
#define mkpr make_pair
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
template<class T>
void ckmx(T& a,T b){
    a=max(a,b);
}
template<class T>
void ckmn(T& a,T b){
    a=min(a,b);
}
template<class T>
T gcd(T a,T b){
    return !b?a:gcd(b,a%b);
}
template<class T>
T lcm(T a,T b){
    return a/gcd(a,b)*b;
}
#define gc getchar()
#define eb emplace_back
#define pc putchar
#define ep empty()
#define fi first
#define se second
#define pln pc('\n');
#define islower(ch) (ch>='a'&&ch<='z')
#define isupper(ch) (ch>='A'&&ch<='Z')
#define isalpha(ch) (islower(ch)||isupper(ch))
template<class T>
void wrint(T x){
    if(x<0){
        x=-x;
        pc('-');
    }
    if(x>=10){
        wrint(x/10);
    }
    pc(x%10^48);
}
template<class T>
void wrintln(T x){
    wrint(x);
    pln
}
template<class T>
void read(T& x){
    x=0;
    int f=1;
    char ch=gc;
    while(!isdigit(ch)){
        if(ch=='-')f=-1;
        ch=gc;
    }
    while(isdigit(ch)){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=gc;
    }
    x*=f;
}
/*
主席树维护 i 结尾,最后一个区间长度 =j 的最小代价
ST 表维护区间 gcd
*/
const int maxn=1e5+5;
int n;
ll C;
int a[maxn];
ll b[maxn];
ll preb[maxn];
ll wb(int l,int r){
    return preb[r]-preb[l-1];
}
struct ST{
    int _gcd[18][maxn];
    void init(){
        FOR(i,1,n){
            _gcd[0][i]=a[i];
        }
        FOR(i,1,17){
            FOR(j,1,n-(1<<i)+1){
                _gcd[i][j]=gcd(_gcd[i-1][j],_gcd[i-1][j+(1<<i-1)]);
            }
        }
    }
    int qgcd(int l,int r){
        int _=__lg(r-l+1);
        return gcd(_gcd[_][l],_gcd[_][r-(1<<_)+1]);
    }
}st;
struct HJT{
    struct Node{
        int ls,rs;
        ll mn;
    }nd[32400005];
    // 1e5*(18^2)
    int ndcnt;
    void pushup(Node& x){
        x.mn=min(nd[x.ls].mn,nd[x.rs].mn);
    }
    void bd(int& rt,int l,int r){
        if(!rt)rt=++ndcnt;
        nd[rt].mn=1e18;
        if(l==r){
            return;
        }
        int mid=(l+r>>1);
        bd(nd[rt].ls,l,mid);
        bd(nd[rt].rs,mid+1,r);
    }
    void chg(int& rtold,int& rtnew,int l,int r,int x,ll _v){
        if(!rtnew){
            rtnew=++ndcnt;
            nd[rtnew].mn=nd[rtold].mn;
        }
        if(l==r){
            ckmn(nd[rtnew].mn,_v);
            return;
        }
        int mid=(l+r>>1);
        if(mid>=x){
            if(nd[rtnew].ls==nd[rtold].ls)nd[rtnew].ls=0;// 这个节点需要新建
            chg(nd[rtold].ls,nd[rtnew].ls,l,mid,x,_v);
        }
        else{
            if(nd[rtnew].rs==nd[rtold].rs)nd[rtnew].rs=0;// 同理
            chg(nd[rtold].rs,nd[rtnew].rs,mid+1,r,x,_v);
        }
        if(!nd[rtnew].ls)nd[rtnew].ls=nd[rtold].ls;
        if(!nd[rtnew].rs)nd[rtnew].rs=nd[rtold].rs;
        pushup(nd[rtnew]);
    }
    ll qmn(int rt,int curl,int curr,int l,int r){
        if(!rt)return 1e18;
        if(curl>=l&&curr<=r){
            return nd[rt].mn;
        }
        int mid=(curl+curr>>1);
        ll ans=1e18;
        if(mid>=l)ckmn(ans,qmn(nd[rt].ls,curl,mid,l,r));
        if(mid<r)ckmn(ans,qmn(nd[rt].rs,mid+1,curr,l,r));
        return ans;
    }
}hjt;
int rt[maxn];
void solve(int id_of_test){
	read(n);
    read(C);
	if(n==1&&C==114)puts("wtf");
    FOR(i,1,n){
        read(a[i]);
    }
    st.init();
    FOR(i,1,n){
        read(b[i]);
        preb[i]=preb[i-1]+b[i];
    }
    hjt.bd(rt[0],1,100000);
    FOR(r,1,n){
        rt[r]=++hjt.ndcnt;
        hjt.nd[rt[r]]=hjt.nd[rt[r-1]];
        int ok=0;
        int efl=1,efr=r;
        while(efl<=efr){
            int mid=(efl+efr>>1);
            if(r-mid+1>=st.qgcd(mid,r)){
                ok=mid;
                efl=mid+1;
            }else{
                efr=mid-1;
            }
        }
        if(!ok)continue;// 不存在合法的 l
        int l=ok;// 最右边的合法的 l
        int _gcd=st.qgcd(l,r);
      //  printf("r = %d\n",r);
        while(l>=1){
        //    printf("l %d _gcd = %d\n",l,_gcd);
            if(r-l+1>=_gcd){
                // 合法,计算答案
                
                ll sum=1ll*_gcd*wb(l,r);
                ll ans=sum;
              //  printf("[%d,%d] sum %d %lld\n",l,r,_gcd,sum);
                ckmn(ans,sum+C+hjt.qmn(rt[l-1],1,100000,1,_gcd));
         //       printf("[%d,%d] ans %lld\n",l,r,ans);
                hjt.chg(rt[r-1],rt[r],1,100000,r-l+1,ans);
          //      printf("[%d,%d] len = %d gcd = %d dp %lld\n",l,r,r-l+1,_gcd,ans);
                /*if(ans+C==-3037806949){
                    printf("[%d,%d] sum %lld\n",l,r,sum);
                }*/
            }
            // 目前 l 是本 gcd 同色块的右端点
            int efl=1,efr=l;
            int ok=l;
            while(efl<=efr){
                int mid=(efl+efr>>1);
                if(st.qgcd(mid,r)!=_gcd){
                    efl=mid+1;
                }else{
                    ok=mid;
                    efr=mid-1;
                }
            }
            // ok 就是本 gcd 同色块的左端点
          //  printf("ok %d\n",ok);
            l=ok-1;
            if(l)_gcd=st.qgcd(l,r);
        }
    }
    printf("%lld\n",hjt.qmn(rt[n],1,100000,1,100000)+C);
}
int main()
{
	int T;
	read(T);
	FOR(_,1,T){
		solve(_);
	}
	return 0;
}