結果
| 問題 |
No.974 最後の日までに
|
| コンテスト | |
| ユーザー |
beet
|
| 提出日時 | 2020-01-17 22:18:34 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,109 bytes |
| コンパイル時間 | 2,652 ms |
| コンパイル使用メモリ | 208,392 KB |
| 最終ジャッジ日時 | 2025-01-08 18:46:58 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 TLE * 37 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using Int = long long;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}
template<typename T> void drop(const T &x){cout<<x<<endl;exit(0);}
//INSERT ABOVE HERE
signed main(){
Int n;
cin>>n;
vector<Int> as(n),bs(n),cs(n);
for(Int i=0;i<n;i++) cin>>as[i]>>bs[i]>>cs[i];
if(n==1) drop(0);
Int sum=0;
for(Int i=0;i<n;i++) sum+=as[i];
Int h1=n/2;
Int h2=n-h1;
Int s1=1<<h1;
Int s2=1<<h2;
Int ans=0;
// not take [h1-1, h1]
{
using P = pair<Int, Int>;
vector<P> vp;
for(Int bit=0;bit<s1;bit++){
vector<Int> vs(h1);
for(Int i=0;i+1<h1;i++)
vs[i]=(bit>>i)&1;
Int flg=0;
for(Int i=0;i+1<h1;i++)
flg|=vs[i]&&vs[i+1];
if(flg) continue;
Int wei=0,val=0;
for(Int i=0;i+1<h1;i++){
if(vs[i]){
wei+=as[i]+as[i+1]+cs[i+1];
val+=bs[i+1];
}
}
vp.emplace_back(wei,val);
}
sort(vp.begin(),vp.end());
vector<P> vq;
for(auto p:vp)
if(vq.empty()||vq.back().second<p.second)
vq.emplace_back(p);
for(Int bit=0;bit<s2;bit++){
vector<Int> vs(h2);
for(Int i=0;i+1<h2;i++)
vs[i]=(bit>>i)&1;
Int flg=0;
for(Int i=0;i+1<h2;i++)
flg|=vs[i]&&vs[i+1];
if(flg) continue;
Int wei=0,val=0;
for(Int i=0;i+1<h2;i++){
if(vs[i]){
wei+=as[h1+i]+as[h1+i+1]+cs[h1+i+1];
val+=bs[h1+i+1];
}
}
auto it=upper_bound(vq.begin(),vq.end(),P(sum-wei+1,-1));
if(it==vq.begin()) continue;
--it;
if(it!=vq.end()){
assert(it->first+wei<=sum);
chmax(ans,it->second+val);
}
}
}
// take [h1-1, h1]
{
using P = pair<Int, Int>;
vector<P> vp;
for(Int bit=0;bit<s1;bit++){
vector<Int> vs(h1);
for(Int i=0;i+1<h1;i++)
vs[i]=(bit>>i)&1;
Int flg=0;
for(Int i=0;i+1<h1;i++)
flg|=vs[i]&&vs[i+1];
if(flg) continue;
Int wei=as[h1-1]+as[h1]+cs[h1],val=bs[h1];
for(Int i=0;i+1<h1-1;i++){
if(vs[i]){
wei+=as[i]+as[i+1]+cs[i+1];
val+=bs[i+1];
}
}
vp.emplace_back(wei,val);
}
sort(vp.begin(),vp.end());
vector<P> vq;
for(auto p:vp)
if(vq.empty()||vq.back().second<p.second)
vq.emplace_back(p);
for(Int bit=0;bit<s2;bit++){
vector<Int> vs(h2);
for(Int i=0;i+1<h2;i++)
vs[i]=(bit>>i)&1;
Int flg=0;
for(Int i=0;i+1<h2;i++)
flg|=vs[i]&&vs[i+1];
if(flg) continue;
Int wei=0,val=0;
for(Int i=1;i+1<h2;i++){
if(vs[i]){
wei+=as[h1+i]+as[h1+i+1]+cs[h1+i+1];
val+=bs[h1+i+1];
}
}
auto it=upper_bound(vq.begin(),vq.end(),P(sum-wei+1,-1));
if(it==vq.begin()) continue;
--it;
if(it!=vq.end()){
assert(it->first+wei<=sum);
chmax(ans,it->second+val);
}
}
}
cout<<ans<<endl;
return 0;
}
beet