Logo Wy Online Judge

WyOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#335#7. 「WyOJ Round 1」归 · 星穗垂野Pigsyy1009307ms136908kbC++234.6kb2025-04-18 20:57:042025-04-18 20:57:04

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline
#define pii pair<int,int>
#define x first
#define y second
#define gc getchar()
#define rd read()
#define debug() puts("------------")

namespace yzqwq{
    il int read(){
        int x=0,f=1;char ch=gc;
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=gc;}
        while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=gc;
        return x*f;
    }
    il int qmi(int a,int b,int p){
        int ans=1;
        while(b){
            if(b&1) ans=ans*a%p;
            a=a*a%p,b>>=1;
        }
        return ans;
    }
    il int gcd(int a,int b){
        if(!b) return a;
        return gcd(b,a%b);
    }
    il int lcm(int a,int b){
        return a/gcd(a,b)*b;
    }
    il void exgcd(int a,int b,int &x,int &y){
        if(!b) return x=1,y=0,void(0);
        exgcd(b,a%b,x,y);
        int t=x;
        x=y,y=t-a/b*x;
        return ;
    }
    il int F(int n,int a,int b,int c){
        //sum{|_ (ai+b)/c _| i:0~n}
        if(!n) return b/c;
        if(!a) return (n+1)*(b/c);
        if(a>=c||b>=c){
            int x=a/b,y=b/c;
            return n*(n+1)/2*x+(n+1)*y+F(n,a%c,b%c,c);
        }
        int m=(a*n+b)/c;
        return n*m+F(m-1,c,c-b+1,a);
    }
    struct lb{
        int d[64];
        il void print(){
            for(re int i=0;i<63;++i)
            if(d[i]) printf("%lld:%lld\n",i,d[i]);
            return ;
        }
        lb(){memset(d,0,sizeof(d));}
        il void operator +=(int x){
            for(re int i=62;i>=0;--i){
                if(!(x&(1ll<<i))) continue;
                if(d[i]) x^=d[i];
                else return d[i]=x,void(0);
            }
            return ;
        }
        int& operator [](int x){
            return d[x];
        }
        il void operator +=(lb &x){
            for(re int i=62;i>=0;--i)
            if(x[i]) *this+=x[i];
            return ;
        }
        il friend lb operator +(lb &x,lb &y){
            lb z=x;
            for(re int i=62;i>=0;--i)
            if(y[i]) z+=y[i];
            return z;
        }
        il int Max_calc(){
            int ans=0;
            for(re int i=62;i>=0;--i)
            if((ans^d[i])>ans) ans^=d[i];
            return ans;
        }
    };
	mt19937 rnd(time(0));
}
using namespace yzqwq;
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)

const int N=1e5+10,inf=1e18;
int n,C;
int a[N],b[N],s[N];
int __[N],Gcd[N][20];
struct Tree{
	int l,r,mi;
}tr[N<<2];
struct node{
	int i,j,delta,k;
};
struct node_{
	int j,k;
};
vector<node_> vec_[N];
vector<node> vec[N];

il void up(int u){
	tr[u].mi=min(tr[ls(u)].mi,tr[rs(u)].mi);
	return ;
}
il void build(int u,int l,int r){
	tr[u].l=l,tr[u].r=r,tr[u].mi=inf;
	if(l==r) return ;
	int mid=l+r>>1;
	build(ls(u),l,mid),build(rs(u),mid+1,r);
	return ;
}
il void modify(int u,int x,int y){
	if(tr[u].l==tr[u].r) return tr[u].mi=min(tr[u].mi,y),void(0);
	int mid=tr[u].l+tr[u].r>>1;
	if(x<=mid) modify(ls(u),x,y);
	else modify(rs(u),x,y);
	return up(u),void(0);
}
il int query(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r) return tr[u].mi;
	int mid=tr[u].l+tr[u].r>>1;
	if(l<=mid&&mid< r) return min(query(ls(u),l,r),query(rs(u),l,r));
	if(l<=mid) return query(ls(u),l,r);
	return query(rs(u),l,r);
}
il int get_gcd(int l,int r){
	int k=__[r-l+1];
	return gcd(Gcd[l][k],Gcd[r-(1ll<<k)+1][k]);
}

il void solve(){
	n=rd,C=rd;
	for(re int i=0;i<=n;++i) __[i]=log2(i),vec[i].clear(),vec_[i].clear();
	for(re int i=1;i<=n;++i) a[i]=rd,Gcd[i][0]=a[i];
	for(re int i=1;i<=n;++i) b[i]=rd,s[i]=s[i-1]+b[i];
	for(re int j=1;j<20;++j)
	for(re int i=1;i+(1ll<<j)-1<=n;++i) Gcd[i][j]=gcd(Gcd[i][j-1],Gcd[i+(1ll<<(j-1))][j-1]);
	for(re int r=1;r<=n;++r){
		int u=r;
		while(u>=1){
			int gcdd=get_gcd(u,r);
			int le=1,ri=u,w=-1;
			while(le<=ri){
				int mid=le+ri>>1;
				if(get_gcd(mid,r)>=gcdd) w=mid,ri=mid-1;
				else le=mid+1;
			}
			int x=w,y=u;
			//r+1-gcdd>=l
			int l=r+1-gcdd;
			l=min(l,y);
			if(l<x){
				u=x-1;
				continue;
			}
			vec[l-1].push_back({r,r-l+1,gcdd*s[r]-gcdd*s[l-1]+C,gcdd});
			u=x-1;
		}
	}
	build(1,0,N-1);
	vec_[0].push_back({0,0});
	for(re int r=0;r<=n;++r){
		for(auto x:vec_[r]){
			int j=x.j,k=x.k;
			modify(1,x.j,x.k);
		}
		for(auto x:vec[r]){
			int i=x.i,j=x.j,delta=x.delta,k=x.k;
			int Min=query(1,0,k);
			vec_[i].push_back({j,delta+Min});
		}
	}
//	if(tr[1].mi==0) assert(0);
	printf("%lld\n",query(1,1,N-1));
    return ;
}

signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
    int t=rd;while(t--)
    solve();
    return 0;
}

这程序好像有点Bug,我给组数据试试?

Details

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 1419ms
memory: 18128kb

input:

1000
10 -759451753
8 10 5 7 5 10 6 10 2 1
5 6 5 4 9 8 5 4 1 3
10 -953033990
4 10 10 8 8 2 1 7 4 1
0 ...

output:

-2278355214
-2859101918
-21349075
-1203387136
-1290642033
-851981042
-648655823
-1699966984
-1493814...

result:

ok 1000 numbers

Test #2:

score: 10
Accepted
time: 516ms
memory: 43700kb

input:

5
94253 6998801
88374 94432 21568 79110 3746 94223 86214 12083 54743 1622 16110 18595 18994 3665 547...

output:

6999125
764376403
718240695
1381649585
885156744

result:

ok 5 number(s): "6999125 764376403 718240695 1381649585 885156744"

Test #3:

score: 10
Accepted
time: 19ms
memory: 16844kb

input:

5
120 -848255662
53358 95098 92852 36846 80052 83050 44071 22632 50005 52339 7339 38495 66618 6337 5...

output:

-11025209476
-3953017107
-5975377615
-2466586019
-5823678268

result:

ok 5 number(s): "-11025209476 -3953017107 -5975377615 -2466586019 -5823678268"

Test #4:

score: 10
Accepted
time: 10ms
memory: 16900kb

input:

5
100 -964452256
94167 36596 60051 82090 55625 56197 94589 29844 14929 68497 81714 90264 66283 96767...

output:

-7714370390
-19569375783
-554464800
-1059581333
-6827008162

result:

ok 5 number(s): "-7714370390 -19569375783 -554464800 -1059581333 -6827008162"

Test #5:

score: 10
Accepted
time: 36ms
memory: 18716kb

input:

5
984 -715414516
65632 15191 55392 53178 88695 20308 44882 16528 12986 81169 76880 2239 81264 13866 ...

output:

-72952473687
-64021627506
-700730085
-994178012
-1624804963

result:

ok 5 number(s): "-72952473687 -64021627506 -700730085 -994178012 -1624804963"

Test #6:

score: 10
Accepted
time: 1433ms
memory: 125332kb

input:

5
83593 -175988991
46605 26358 5204 30137 41225 11710 75224 14130 56433 62524 29873 59483 22318 2619...

output:

-1656361289384
-4920133073293
-1028097824
-2809116480
-22668175189

result:

ok 5 number(s): "-1656361289384 -4920133073293 ...097824 -2809116480 -22668175189"

Test #7:

score: 10
Accepted
time: 1581ms
memory: 135864kb

input:

5
96302 -451340376
2672 47391 49737 61648 38099 10679 28316 91168 97182 40556 20560 89630 45931 9187...

output:

-4877361987440
-9327808595024
-261498007
97842263
-37427524204

result:

ok 5 number(s): "-4877361987440 -9327808595024 -261498007 97842263 -37427524204"

Test #8:

score: 10
Accepted
time: 1535ms
memory: 136908kb

input:

5
82075 -915749780
41503 94470 21657 60519 10090 65640 80911 29436 63096 68715 79609 87499 26240 606...

output:

-8500967499879
-2162204721519
-803472133
-6968294203
-60694304098

result:

ok 5 number(s): "-8500967499879 -2162204721519 ...472133 -6968294203 -60694304098"

Test #9:

score: 10
Accepted
time: 1388ms
memory: 125856kb

input:

5
86206 -158351237
12910 53574 97622 75378 61116 40492 87106 60678 72614 2146 43673 15147 23123 7469...

output:

-1508037508585
-4714642449519
-3202809425
-6778545312
-12974512083

result:

ok 5 number(s): "-1508037508585 -4714642449519 ...809425 -6778545312 -12974512083"

Test #10:

score: 10
Accepted
time: 1370ms
memory: 122112kb

input:

5
87683 -236086252
88768 76878 54808 98282 70961 83599 48353 34381 40413 95288 24241 74500 52966 994...

output:

-2319782085288
-10990638538852
-1651187059
-12428157994
-22719490815

result:

ok 5 number(s): "-2319782085288 -10990638538852...87059 -12428157994 -22719490815"

Extra Test:

score: 0
Extra Test Passed