結果

問題 No.974 最後の日までに
ユーザー LayCurse
提出日時 2020-01-19 05:32:18
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 102 ms / 2,000 ms
コード長 5,843 bytes
コンパイル時間 2,612 ms
コンパイル使用メモリ 216,848 KB
最終ジャッジ日時 2025-01-08 20:13:30
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 49
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void *wmem;
char memarr[96000000];
template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){
static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
(*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );
(*arr)=(T*)(*mem);
(*mem)=((*arr)+x);
}
template<class T1> void sortA_L(int N, T1 a[], void *mem = wmem){
sort(a, a+N);
}
template<class T1, class T2> void sortA_L(int N, T1 a[], T2 b[], void *mem = wmem){
int i;
pair<T1, T2> *arr;
walloc1d(&arr, N, &mem);
for(i=(0);i<(N);i++){
arr[i].first = a[i];
arr[i].second = b[i];
}
sort(arr, arr+N);
for(i=(0);i<(N);i++){
a[i] = arr[i].first;
b[i] = arr[i].second;
}
}
template<class T1> void rsortA_L(int N, T1 a[], void *mem = wmem){
sortA_L(N, a, mem);
reverse(a, a+N);
}
template<class T1, class T2> void rsortA_L(int N, T1 a[], T2 b[], void *mem = wmem){
sortA_L(N, a, b, mem);
reverse(a, a+N);
reverse(b, b+N);
}
inline void rd(int &x){
int k;
int m=0;
x=0;
for(;;){
k = getchar_unlocked();
if(k=='-'){
m=1;
break;
}
if('0'<=k&&k<='9'){
x=k-'0';
break;
}
}
for(;;){
k = getchar_unlocked();
if(k<'0'||k>'9'){
break;
}
x=x*10+k-'0';
}
if(m){
x=-x;
}
}
inline void rd(long long &x){
int k;
int m=0;
x=0;
for(;;){
k = getchar_unlocked();
if(k=='-'){
m=1;
break;
}
if('0'<=k&&k<='9'){
x=k-'0';
break;
}
}
for(;;){
k = getchar_unlocked();
if(k<'0'||k>'9'){
break;
}
x=x*10+k-'0';
}
if(m){
x=-x;
}
}
inline void wt_L(char a){
putchar_unlocked(a);
}
inline void wt_L(long long x){
int s=0;
int m=0;
char f[20];
if(x<0){
m=1;
x=-x;
}
while(x){
f[s++]=x%10;
x/=10;
}
if(!s){
f[s++]=0;
}
if(m){
putchar_unlocked('-');
}
while(s--){
putchar_unlocked(f[s]+'0');
}
}
template<class S> inline void arrInsert(const int k, int &sz, S a[], const S aval){
int i;
sz++;
for(i=sz-1;i>k;i--){
a[i] = a[i-1];
}
a[k] = aval;
}
template<class S, class T> inline void arrInsert(const int k, int &sz, S a[], const S aval, T b[], const T bval){
int i;
sz++;
for(i=sz-1;i>k;i--){
a[i] = a[i-1];
}
for(i=sz-1;i>k;i--){
b[i] = b[i-1];
}
a[k] = aval;
b[k] = bval;
}
template<class S, class T, class U> inline void arrInsert(const int k, int &sz, S a[], const S aval, T b[], const T bval, U c[], const U cval){
int i;
sz++;
for(i=sz-1;i>k;i--){
a[i] = a[i-1];
}
for(i=sz-1;i>k;i--){
b[i] = b[i-1];
}
for(i=sz-1;i>k;i--){
c[i] = c[i-1];
}
a[k] = aval;
b[k] = bval;
c[k] = cval;
}
template<class S, class T, class U, class V> inline void arrInsert(const int k, int &sz, S a[], const S aval, T b[], const T bval, U c[], const U
    cval, V d[], const V dval){
int i;
sz++;
for(i=sz-1;i>k;i--){
a[i] = a[i-1];
}
for(i=sz-1;i>k;i--){
b[i] = b[i-1];
}
for(i=sz-1;i>k;i--){
c[i] = c[i-1];
}
for(i=sz-1;i>k;i--){
d[i] = d[i-1];
}
a[k] = aval;
b[k] = bval;
c[k] = cval;
d[k] = dval;
}
template<class S, class T> inline S divup_L(S a, T b){
return (a+b-1)/b;
}
template<class S, class T> inline S chmax(S &a, T b){
if(a<b){
a=b;
}
return a;
}
int N;
long long A[52];
long long B[52];
long long C[52];
int s1;
long long m1[1000000];
long long g1[1000000];
int s2;
long long m2[1000000];
long long g2[1000000];
void dfs(int s, int e, long long m = 0, long long g = 0){
if(s == e){
arrInsert(s2,s2,g2,g,m2,m);
return;
}
dfs(s+1, e, m+A[s], g);
if(s+2 <= e){
dfs(s+2, e, m-C[s+1], g+B[s+1]);
}
}
void ord(void){
int i;
int k = 0;
rsortA_L(s2, g2, m2);
for(i=(0);i<(s2);i++){
if(k && m2[i] <= m2[k-1]){
continue;
}
arrInsert(k,k,g2,g2[i],m2,m2[i]);
}
s2 = k;
}
long long solve(int n1, int n2){
int i;
int k;
long long res = 0;
s1 = s2 = 0;
dfs(0,n1);
ord();
s1 = s2;
for(i=(0);i<(s1);i++){
m1[i] = m2[i];
}
for(i=(0);i<(s1);i++){
g1[i] = g2[i];
}
s2 = 0;
dfs(n1,n1+n2);
ord();
k = s2-1;
for(i=(0);i<(s1);i++){
while(k-1>=0 && m1[i]+m2[k-1] >= 0){
k--;
}
if(m1[i]+m2[k] < 0){
continue;
}
chmax(res, g1[i] + g2[k]);
}
return res;
}
int main(){
wmem = memarr;
long long res = 0;
rd(N);
{
int KrdatlYV;
for(KrdatlYV=(0);KrdatlYV<(N);KrdatlYV++){
rd(A[KrdatlYV]);
rd(B[KrdatlYV]);
rd(C[KrdatlYV]);
}
}
chmax(res, solve(N/2,divup_L(N,2)));
chmax(res, solve(N/2+1, (divup_L(N,2))-1));
wt_L(res);
wt_L('\n');
return 0;
}
// cLay varsion 20200119-1
// --- original code ---
// int N; ll A[52], B[52], C[52];
//
// int s1; ll m1[1d6], g1[1d6];
// int s2; ll m2[1d6], g2[1d6];
//
// void dfs(int s, int e, ll m = 0, ll g = 0){
// if(s == e){
// arrInsert(s2,s2,g2,g,m2,m);
// return;
// }
// dfs(s+1, e, m+A[s], g);
// if(s+2 <= e) dfs(s+2, e, m-C[s+1], g+B[s+1]);
// }
//
// void ord(void){
// int i, k = 0;
// rsortA(s2, g2, m2);
// rep(i,s2){
// if(k && m2[i] <= m2[k-1]) continue;
// arrInsert(k,k,g2,g2[i],m2,m2[i]);
// }
// s2 = k;
// }
//
// ll solve(int n1, int n2){
// int i, k;
// ll res = 0;
// s1 = s2 = 0;
//
// dfs(0,n1); ord();
// s1 = s2;
// rep(i,s1) m1[i] = m2[i];
// rep(i,s1) g1[i] = g2[i];
// s2 = 0;
// dfs(n1,n1+n2); ord();
//
// k = s2-1;
// rep(i,s1){
// while(k-1>=0 && m1[i]+m2[k-1] >= 0) k--;
// if(m1[i]+m2[k] < 0) continue;
// res >?= g1[i] + g2[k];
// }
//
// return res;
// }
//
// {
// ll res = 0;
// rd(N,(A,B,C)(N));
// res >?= solve(N/2, N/+2);
// res >?= solve(N/2+1, (N/+2)-1);
// wt(res);
// }
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0