제출 #697918

#제출 시각아이디문제언어결과실행 시간메모리
697918BreakOfDawnSplit the sequence (APIO14_sequence)C++17
0 / 100
661 ms81332 KiB
// Author : 13minusone
#include<bits/stdc++.h>
using namespace std;
#define task "test"
#define SZ(c) (c).size()
#define getbit(x,i) (((x) >> (i)) & 1)
#define turnoff(x,i) (x)&(~(1<<(i)))
#define __builtin_popcount __builtin_popcountll
#define all(x) (x).begin(),(x).end()
#define pb(x) push_back(x)
#define eb(x) emplace_back(x)
#define TIME  (1.0 * clock() / CLOCKS_PER_SEC)
#define fi first
#define se second
#define FOR(i,l,r) for(int i = l ; i <= r ; i++)
#define FD(i,l,r) for(int i = l ; i >= r ; i--)
#define REP(i,l,r) for(int i = l ; i <r ; i++)

typedef long long ll ;
typedef pair<int,int> ii;
template <class T>
inline bool minimize(T &a, const T &b) { return (a > b ? (a = b),1 : 0); }
template <class T>
inline bool maximize(T &a, const T &b) { return (a < b ? (a = b),1 : 0); }

const int N = 1e5 + 5;
//const int MOD =1e9+7;
//const ll base = 311;
//const int BLOCK = 488;
//const int INF = 1e9 + 7;
int n, k, trace[N][201], pre[N], Now = 0, a[N] ;
vector<ll>cur, tmp;
void solve(int l, int r, int optl, int optr)
{
    if(l > r)return;
    pair<ll, int>best = {0, 0};
    int mid = (l+r) >> 1;
    FOR(i,optl, min(optr, mid) - 1)
        maximize(best, make_pair(cur[i] + 1LL * (pre[mid] - pre[i]) * (pre[n] - pre[mid]), i));
    trace[mid][Now] = best.se;
    tmp[mid] = best.fi;
//    cout << mid << " " << Now << " " << best.fi << " " << best.se << endl;
    solve(l, mid - 1, optl, best.se);
    solve(mid + 1, r, best.se, optr);
}
void init(void)
{
    cin >> n >> k;
    FOR(i,1,n)
    {
        cin >> a[i];
        pre[i] = pre[i - 1] + a[i];
    }
    cur.assign(n, 0);
    tmp.assign(n, 0);
    FOR(i,1,n - 1){
        cur[i] = pre[i] * (pre[n] - pre[i]);
        trace[i][1] = i;
        //cout << i << " "<< cur[i] << endl;
    }
    FOR(i,2,k)
    {
        Now = i;
        solve(1,n - 1, 1, n - 1);
        cur = tmp;
        tmp.assign(n , 0);
    }
    ll ans = 0;
    int u = -1, l = k;
    FOR(i,1,n - 1)
        if(maximize(ans, cur[i]))
            u = i;
    cout << ans << endl;
    vector<int>vec;
    vec.pb(u);
    while(l > 1)
    {
        vec.pb(trace[u][l]);
        u = trace[u][l];
        l--;
    }
    reverse(all(vec));
    for(int i : vec)
        cout << i << " " ;
}
void process(void)
{
}
signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if(fopen(task".inp","r"))
    {
        freopen(task".inp","r",stdin);
        freopen(task".out","w",stdout);
    }
    int t = 1;
    //cin >> t;
    while(t--)
    {
        init();
        process();
    }
    cerr << "TIME : " << TIME << "s\n";
}


컴파일 시 표준 에러 (stderr) 메시지

sequence.cpp: In function 'int main()':
sequence.cpp:95:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   95 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
sequence.cpp:96:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   96 |         freopen(task".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...