QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#754548 | #9552. The Chariot | ucup-team5318# | WA | 0ms | 3820kb | C++14 | 3.3kb | 2024-11-16 15:17:34 | 2024-11-16 15:17:35 |
Judging History
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;
}
详细
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'