# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
339756 | blue | 수열 (APIO14_sequence) | C++11 | 214 ms | 6764 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <set>
using namespace std;
long long sq(long long a)
{
return a*a;
}
/*
int main()
{
int n, k;
cin >> n >> k;
long long a[n+1];
a[0] = 0;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
a[i] += a[i-1];
}
int right[k+2]; //rightmost element belonging to the i'th part from the left.
right[0] = 0;
for(int j = 1; j <= k; j++) right[j] = j;
right[k+1] = n;
bool flag = 1;
while(flag)
{
flag = 0;
for(int j = k; j >= 1; j--)
{
while(right[j]+1 < right[j+1] && a[ right[j+1] ] - a[ right[j]+1 ] >= a[ right[j] ] - a[ right[j-1] ])
{
right[j]++;
flag = 1;
}
}
}
long long res = sq(a[n]);
for(int j = 1; j <= k+1; j++) res -= sq(a[ right[j] ] - a[ right[j-1] ]);
res /= 2;
cout << res << '\n';
for(int i = 1; i <= k; i++) cout << right[i] << ' ';
cout << '\n';
}*/
long long a[100001];
int nxt[100003]; //barrier i occurs between i and i+1
int prv[100003];
struct barrier
{
int i;
};
bool operator < (barrier P, barrier Q)
{
if((a[nxt[P.i]] - a[P.i]) * (a[P.i] - a[prv[P.i]]) == (a[nxt[Q.i]] - a[Q.i]) * (a[Q.i] - a[prv[Q.i]]))
return P.i < Q.i;
return (a[nxt[P.i]] - a[P.i]) * (a[P.i] - a[prv[P.i]]) < (a[nxt[Q.i]] - a[Q.i]) * (a[Q.i] - a[prv[Q.i]]);
}
set<barrier> S;
int main()
{
int n, k;
cin >> n >> k;
long long res = 0;
a[0] = 0;
nxt[0] = 1;
prv[0] = -1;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
a[i] += a[i-1];
nxt[i] = i+1;
prv[i] = i-1;
}
nxt[n] = n+1;
prv[n] = n-1;
res = sq(a[n]);
for(int i = 1; i <= n; i++) res -= sq(a[i] - a[i-1]);
res /= 2;
// cout << res << '\n';
for(int i = 1; i < n; i++) S.insert(barrier{i});
while(S.size() > k)
{
// cout << "________________________________________---\n";
// for(barrier s:S) cout << s.i << ' ';
// cout << '\n';
//
// for(int i = 1; i < n; i++)
// {
// cout << a[i] - a[i-1];
// if(S.find(barrier{i}) != S.end()) cout << '|';
// else cout << ' ';
// }
// cout << a[n] - a[n-1] << '\n';
// cout << res << '\n';
int g = S.begin()->i;
S.erase(S.begin());
// cout << S.size() << '\n';
// cout << "barrier=" << g << ' ' << "nxt=" << nxt[g] << ' ' << "prv=" << prv[g] << '\n';
if(nxt[g] < n) S.erase(barrier{nxt[g]});
if(prv[g] > 0) S.erase(barrier{prv[g]});
prv[nxt[g]] = prv[g];
nxt[prv[g]] = nxt[g];
if(nxt[g] < n) S.insert(barrier{nxt[g]});
if(prv[g] > 0) S.insert(barrier{prv[g]});
// cout << a[prv[g]] << ' ' << a[g] << ' ' << a[nxt[g]] << '\n';
res -= (a[nxt[g]] - a[g]) * (a[g] - a[prv[g]]);
// cout << "temp\n";
}
//
// for(int i = 1; i < n; i++)
// {
// cout << a[i] - a[i-1];
// if(S.find(barrier{i}) != S.end()) cout << '|';
// else cout << ' ';
// }
// cout << a[n] - a[n-1] << '\n';
cout << res << '\n';
for(barrier x:S) cout << x.i << ' ';
cout << '\n';
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |