제출 #490871

#제출 시각아이디문제언어결과실행 시간메모리
490871hohohahaSplit the sequence (APIO14_sequence)C++14
100 / 100
956 ms89436 KiB
// #pragma GCC optimize("Ofast")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
// #pragma GCC optimize("unroll-loops")

#include "bits/stdc++.h"
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/trie_policy.hpp>
// #include <ext/rope>

using namespace std;
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;

#define li long long
#define ld long double
#define ii pair<int, int>
#define vi vector<int> 
#define vvi vector<vi>


#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pf push_front
#define eb emplace_back
#define em emplace
#define ob pop_back
#define om pop
#define of pop_front

#define fr front
#define bc back

#define fori(i, a, b) for(int i = (int) (a); i <= (int) (b); ++i)
#define ford(i, a, b) for(int i = (int) (a); i >= (int) (b); --i)

#define all(x) begin(x), end(x)
#define sz(x) ((int)(x).size())
#define bitc __builtin_popcountll

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define rand rng
#define endl '\n'
#define sp ' '

#define fastio() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

void solve();

signed main() {
// freopen("input.inp","r",stdin);
// freopen("output.out","w",stdout);
//   fastio();
   int tc = 1;
   fori(test, 1, tc) {
      solve();
   }
   return 0;
}

#define int long long
const ld pi = 4 * atan(1.0), eps = 1e-9;

const int inf = LLONG_MAX / 2ll;
const int maxn = 2e5 + 5; 
int n, k; 
int32_t arr[maxn]; 
int pref[maxn]; 

vi now, prv; 

struct line { 
	int32_t a; int b; int32_t id; 
	line(int a = 0, int b = 0, int id = 0) : a(a), b(b), id(id) {
	}
	int get(int x) { 
		return 1ll * a * x + b; 
	}
}; 

bool red(line x, line y, line z) { 
	return (x.b - y.b) * (z.a - y.a) >= (y.b - z.b) * (y.a - x.a); 
}

int32_t tr[maxn][205]; 

void solve() {
	cin >> n >> k; k++; 
	fori(i, 1, n) { 
		cin >> arr[i]; 
		pref[i] = arr[i] + pref[i - 1]; 
	}
	now = prv = vi(n + 1, -inf); 
	now[0] = 0; 
	fori(t, 1, k) { 
		now.swap(prv); 
		fill(all(now), -inf); 
//		now[0] = 0; 
		
//		cout << t << endl;
		
		vector<line> C; int ptr = -1; 
		fori(i, 1, n) { 
			if(prv[i - 1] > -inf) {
				line nw(pref[i - 1], prv[i - 1] - pref[i -1] * pref[i - 1], i - 1); 
				while(1) { 
					if(C.size() > 0 and (end(C) - 1)->a == nw.a and (end(C) - 1)->b < nw.b) C.ob(); 
					else if(C.size() > 1 and red(*(end(C) - 2), *(end(C) - 1), nw) ) C.ob(); 
					else break; 
				}
				ptr = min(ptr, (int)C.size() - 1); 
				C.eb(nw); 
			}
//			cout << i << endl;
			ptr = min(ptr, (int)C.size() - 1); 
			while(ptr + 1 < C.size() and (ptr == -1 or C[ptr].get(pref[i]) <= C[ptr + 1].get(pref[i]))) ++ptr; 
			if(ptr > -1) {
				now[i] = C[ptr].get(pref[i]); 
				tr[i][t] = C[ptr].id; 
			}
//			cout << i << sp << t << sp << ptr << sp << tr[i][t] << sp << now[i] << endl;
		}
	}
	cout << now[n] << endl; 
	int pos = n; 
	vi ans; 
	ford(i, k, 1) { 
		ans.eb(pos); //cout << pos << sp; 
//		cout << k << sp << pos << endl;
		pos = tr[pos][i]; 
	}
	reverse(all(ans)); 
	fori(i, 0, k - 2) cout << ans[i] << sp; 
}

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

sequence.cpp: In function 'void solve()':
sequence.cpp:117:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<line>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  117 |    while(ptr + 1 < C.size() and (ptr == -1 or C[ptr].get(pref[i]) <= C[ptr + 1].get(pref[i]))) ++ptr;
      |          ~~~~~~~~^~~~~~~~~~
#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...