QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#422575 | #7520. Monster Generator | Tx_Lcy | WA | 2ms | 3888kb | C++14 | 2.9kb | 2024-05-27 16:36:38 | 2024-05-27 16:36:39 |
Judging History
answer
//A tree without skin will surely die.
//A man without face is invincible.
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mid ((l+r)>>1)
#define all(x) (x).begin(),(x).end()
#define rep(i,j,k) for (int i=j;i<=k;++i)
#define per(i,j,k) for (int i=j;i>=k;--i)
#define ull unsigned long long
int const N=105;
int n,m,top,stk[N],id[N],a[N],da[N],b[N],db[N],A[N],B[N];
__int128 k[N],bb[N];
ull sm;
inline vector<int> get(int x){
vector<int>V;
rep(i,1,n) A[i]=a[i]+da[i]*x,B[i]=b[i]+db[i]*x;
vector<int>a,b;
rep(i,1,n)
if (A[i]<=B[i]) a.push_back(i);
else b.push_back(i);
sort(all(a),[](int x,int y){return A[x]<A[y];});
sort(all(b),[](int x,int y){return B[x]>B[y];});
for (auto i:a) V.push_back(i);
for (auto i:b) V.push_back(i);
return V;
}
double const eps=1e-12;
inline double jiao(int x,int y){
return 1.0*(bb[y]-bb[x])/(k[x]-k[y]);
}
inline int dcmp(double x){
if (x>eps) return 1;
if (x<-eps) return -1;
return 0;
}
void solve(){
cin>>n>>m;
// cerr<<n<<" ?S?DF?\n";
rep(i,1,n) cin>>a[i]>>da[i]>>b[i]>>db[i];
// cerr<<"over?\n";
vector<int>V=get(0);
__int128 Sm=0,mx=0;int la=0;
for (auto i:V) Sm+=a[i]-b[la],mx=max(mx,Sm),la=i;
sm=mx;
rep(i,1,m){
int l=i,r=m,ans=0;
vector<int>V=get(i);
while (l<=r)
if (get(mid)==V) l=(ans=mid)+1;
else r=mid-1;
int ct=0,la=0;
for (auto x:V){
++ct;
k[ct]=k[ct-1]+da[x]-db[la];
bb[ct]=bb[ct-1]+a[x]-b[la];
la=x;
}
rep(i,1,n) id[i]=i;
sort(id+1,id+n+1,[](int x,int y){return (k[x]^k[y])?(k[x]<k[y]):(bb[x]>bb[y]);});
top=0;
rep(i,1,n){
if (i>1 && k[id[i]]==k[id[i-1]]) continue;
while (top>1 && dcmp(jiao(stk[top],stk[top-1])-jiao(id[i],stk[top-1]))>=0) --top;
stk[++top]=id[i];
}
la=i;
rep(i,1,top){
int X=stk[i],Y=stk[i+1],l=0,r=ans,res=0;
if (i==top) res=ans;
else{
while (l<=r)
if (k[X]*mid+bb[X]>=k[Y]*mid+bb[Y]) l=(res=mid)+1;
else r=mid-1;
}
if (la<=res){
sm+=1ull*((__int128)(la+res)*(res-la+1)/2)*k[X]+1ull*bb[X]*(res-la+1);
// cout<<la<<','<<res<<" -> "<<i<<" zhuanyi!\n";
// rep(p,la,res)
// sm+=1ull*k[X]*p+1ull*bb[X];
la=res+1;
}
}
// cout<<top<<" :\n";
// rep(g,i,ans){
// __int128 mx=0;
// rep(i,1,n)
// mx=max(mx,(__int128)k[i]*g+bb[i]);
// // rep(i,1,ct)
// // if ((__int128)k[i]*g+bb[i]==mx) cout<<i<<' ';
// sm+=mx;
// }
// cout<<'\n';
i=ans;
}
cout<<sm<<'\n';
}
signed main(){
// freopen("yuanshen.in","r",stdin);
// freopen("yuanshen.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t=1;
// cin>>t;
while (t--) solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3816kb
input:
3 5 3 1 5 2 4 2 1 3 1 9 100 1
output:
113
result:
ok single line: '113'
Test #2:
score: 0
Accepted
time: 0ms
memory: 3888kb
input:
3 100000000 3 1 5 2 4 2 1 3 1 9 100 1
output:
35000000549999998
result:
ok single line: '35000000549999998'
Test #3:
score: -100
Wrong Answer
time: 2ms
memory: 3648kb
input:
10 1000000000000000000 776874380544333 197 471391764744275 33 159838820333814 107 677112662750393 41 962335658276824 48 255593531071176 11 127404116579775 209 268525254990127 34 647620110614714 76 897947476313307 13 146196843402516 221 772928712898807 39 637929916804442 2 716937021892338 15 64200226...
output:
9063007984388543404
result:
wrong answer 1st lines differ - expected: '17883317185357051350', found: '9063007984388543404'