제출 #114172

#제출 시각아이디문제언어결과실행 시간메모리
114172patrikpavic2수열 (APIO14_sequence)C++17
33 / 100
2044 ms85752 KiB
#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <vector> #include <set> #include <map> #include <queue> #include <algorithm> #include <algorithm> #include <deque> #define X first #define Y second #define PB push_back using namespace std; typedef long long ll; typedef pair < ll, ll > pll; const int N = 1e5 + 500; const int K = 205; ll ccw(pll A, pll B, pll C){ return A.X * (B.Y - C.Y) + B.X * (C.Y - A.Y) + C.X * (A.Y - B.Y); } int ind[N]; pll hl[N]; int cur = 0, n, k; ll P[N], lst[N], dp[N], a[N]; int rek[N][K], cur_k, sz; void add(pll X, int i){ for(;sz >= 2 && ccw(X, hl[sz - 1], hl[sz - 2]) < 0; sz--); hl[sz] = X; ind[sz++] = i; cur = min(cur, sz - 1); } inline ll get(int i, ll x){ return hl[i].X * x + hl[i].Y; } inline int query(ll x){ if(sz == 0) return -1; for(; cur + 1 < sz && get(cur, x) <= get(cur + 1, x); cur++); return cur; } void dinamika(){ sz = 0; cur = 0; for(int i = 0;i < n;i++){ int r = query(P[i]); dp[i] = -1; if(r >= 0){ rek[i][cur_k] = ind[r]; dp[i] = get(r, P[i]); } if(lst[i] >= 0) add({P[i], lst[i] - P[i] * P[i]}, i); lst[i] = dp[i]; } cur_k++; } int main(){ scanf("%d%d", &n, &k); for(int i = 0;i < n;i++){ scanf("%d", a + i); P[i] = a[i] + (i ? P[i - 1] : 0); } for(int i = 0;i < k;i++) dinamika(); printf("%lld\n", dp[n - 1]); vector < int > fin; int cur = n - 1; for(int i = k - 1;i >= 0;i--){ fin.PB(rek[cur][i]); cur = fin.back(); } reverse(fin.begin(), fin.end()); for(int x : fin) printf("%d ", x + 1); printf("\n"); }

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

sequence.cpp: In function 'int main()':
sequence.cpp:70:26: warning: format '%d' expects argument of type 'int*', but argument 2 has type 'll* {aka long long int*}' [-Wformat=]
         scanf("%d", a + i);
                     ~~~~~^
sequence.cpp:68:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &n, &k);
     ~~~~~^~~~~~~~~~~~~~~~
sequence.cpp:70:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", a + i);
         ~~~~~^~~~~~~~~~~~~
#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...