QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#754548#9552. The Chariotucup-team5318#WA 0ms3820kbC++143.3kb2024-11-16 15:17:342024-11-16 15:17:35

Judging History

你现在查看的是最新测评结果

  • [2024-11-16 15:17:35]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3820kb
  • [2024-11-16 15:17:34]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using li=__int128;
using pi=pair<int,int>;
#define fi first
#define se second
const int N=2100;
const ll mod=1e18;
typedef vector<ll> inter;
inter read(){
	inter ans;
	string s;cin>>s;
	int len=s.size();
	for(int i=len-1;i>=0;i-=18){
		ll sum=0;
		for(int j=max(i-17,0);j<=i;++j) sum=sum*10+s[j]-'0';
		ans.push_back(sum);
	}
	return ans;
}
void print(inter a){
	int n=a.size()-1;
	printf("%lld",a.back());
	for(int i=n-1;i>=0;--i) printf("%018lld",a[i]);
}
bool operator<(inter a,inter b) {
	if(a.size()!=b.size()) return a.size()<b.size();
	int n=a.size()-1;
	for(int i=n;i>=0;--i)if(a[i]!=b[i]) return a[i]<b[i];
	return 0;
}
bool operator<=(inter a,inter b){
	if(a.size()!=b.size()) return a.size()<b.size();
	int n=a.size()-1;
	for(int i=n;i>=0;--i)if(a[i]!=b[i]) return a[i]<b[i];
	return 1;
}
bool operator>=(inter a,inter b){
	if(a.size()!=b.size()) return a.size()>b.size();
	int n=a.size()-1;
	for(int i=n;i>=0;--i)if(a[i]!=b[i]) return a[i]>b[i];
	return 1;
}
inter operator+(inter a,inter b) {
	int n=a.size()-1,m=b.size()-1;
	if(n<m) n=m,a.resize(n+1);
	for(int i=0;i<=m;++i) a[i]+=b[i];
	for(int i=0;i<n;++i)if(a[i]>=mod) ++a[i+1],a[i]-=mod;
	if(a[n]>=mod) a.push_back(1),a[n]-=mod;
	return a;
}
inter operator-(inter a,inter b){
	int n=a.size()-1,m=b.size()-1;
	for(int i=0;i<=m;++i) a[i]-=b[i];
	for(int i=0;i<=n;++i)if(a[i]<0) --a[i+1],a[i]+=mod;
	for(;n>=1 and !a[n];--n) a.pop_back();
	return a;
}
inter operator*(inter a,inter b){
	if(a==inter{0} or b==inter{0}) return inter{0};
	int n=a.size()-1,m=b.size()-1;
	static li tmp[200];
	memset(tmp,0,sizeof(li)*(n+m+2));
	for(int i=0;i<=n;++i)for(int j=0;j<=m;++j) tmp[i+j]+=(li)a[i]*b[j];
	for(int i=0;i<=n+m;++i)if(tmp[i]>=mod) tmp[i+1]+=tmp[i]/mod,tmp[i]%=mod;
	inter ans(tmp,tmp+n+m+1);
	if(tmp[n+m+1]) ans.push_back(tmp[n+m+1]);
	return ans;
}
__float128 estimate(inter&a){
	int n=a.size()-1;
	__float128 ans=0;
	for(int i=n;i>=0;--i) ans=ans*mod+a[i];
	return ans;
}
inter operator/(inter a,inter b){
	if(a<b) return inter{0};
	int n=a.size()-1,m=b.size()-1;
	inter ans(n-m+1),rem={0};
	for(int i=n;i>=0;--i){
		rem=rem*inter{0,1}+inter{a[i]};
		if(rem>=b){
			ans[i]=estimate(rem)/estimate(b);
			rem=rem-b*inter{ans[i]};
		}
	}
	while(ans.size()>1 && !ans.back()) ans.pop_back();
	return ans;
}
inter A,B,C,D,X,Y;
inter calc(inter d) {
    if(d<=X)return A;
    if(A<=B*X) {
        inter c=d/X,r=d-c*X;
       return c*A+min(c,B*r);
    }return A+(d-X)*B;
}
void solve() {
    A=read(),B=read(),C=read(),X=read(),Y=read(),D=read();
    if(D<=X+Y)print(calc(D));
    else if(A<=min(B,C)*X) {
        inter c=D/X,r=D-c*X;
        if(c.back()==0)print(A);
        inter as;
        if(Y>=r)as=c*A+r*B;
        else as=c*A+Y*B+(r-Y)*C;
        print(min(as,c*A+A));
    }else if(C*(Y+X)>=A+B*Y) {
        inter c=D/(X+Y),r=D-c*(X+Y);
        print(c*(A+B*Y)+calc(r));
    }else {
        inter c=D/(X+Y),r=D-c*(X+Y),as=min(calc(r),C*r);
        print(A+B*Y+(c-inter{1})*C*(X+Y)+as);
    }
    cout<<'\n';
}
int main() {
    #ifndef ONLINE_JUDGE
        freopen(".in","r",stdin);
        freopen(".out","w",stdout);
    #endif
    // ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int tt;cin>>tt;
    while(tt--)solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3820kb

input:

5
160 27 41 3 12 3
160 27 41 3 12 4
160 27 41 3 12 99
1 999 999 1 99 999
999 999 1 1 99 9999999999999999

output:

160
187
3226
999
10000000000099799

result:

ok 5 lines

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 3700kb

input:

2077
63 88 64 47 55 88
4 75 38 53 33 41
41 1 28 6 13 100
57 88 77 35 5 48
100 36 97 24 93 87
57 25 26 84 62 18
29 11 33 88 86 71
33 16 7 4 73 68
50 65 72 14 43 78
15 31 72 42 39 29
31 10 76 58 35 89
39 55 99 11 16 82
21 18 57 44 80 16
38 31 99 58 59 69
24 22 69 76 14 83
96 40 56 31 14 36
75 84 27 57...

output:

64
4
311
114
303
57
29
561
300
15
32
312
21
39
25
97
76
92
97
636
76
32
57
126
39
138
36
605
30
23
88
76
285
20
330
325
174
65
32
36
1
36
30
13
97
86
17
45
83
102
71
86
52
81
25
44
8
21
91
49
51
120
55
82
31
85
79
66
130
21
84
25
156
51
145
88
106
86
2
73
83
5
101
117
44
4
152
58
122
26
57
26
70
78
...

result:

wrong answer 1st lines differ - expected: '126', found: '64'