# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
144409 | vladciuperceanu | Cover (COCI18_cover) | C++14 | 16 ms | 2040 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <set>
#define xx first
#define yy second
using namespace std;
int n,i,j,x,y;
long long d[20005];
pair<long long, long long> v[20005],drept[20005];
set< pair<long long, long long> > s;
int main()
{
cin >> n;
for (i=1; i<=n; i++)
{
cin >> x >> y;
s.insert(make_pair(x, y)); s.insert(make_pair(-x, -y));
s.insert(make_pair(-x, y)); s.insert(make_pair(x, -y));
}
int m = 0;
for (set< pair<long long, long long> >::iterator it=s.begin(); it!=s.end(); it++)
v[++m] = make_pair(it->first, it->second);
long long minim = v[1].yy; long long maxim = v[1].yy; int k = 0;
for (i=2; i<=m; i++)
{
if (v[i].xx >= 0)
break;
if (v[i].xx == v[i-1].xx)
{
maxim = max(maxim, v[i].yy);
minim = min(minim, v[i-1].yy);
}
else
{
if (maxim-minim > drept[k].yy || k == 0)
drept[++k] = make_pair(-v[i-1].xx*2, maxim-minim);
maxim = v[i].yy; minim = v[i].yy;
}
}
if (maxim-minim > drept[k].yy || k == 0)
drept[++k] = make_pair(-v[i-1].xx*2, maxim-minim);
for (i=1; i<=k; i++)
{
d[i] = drept[1].xx*drept[i].yy;
for (j=i; j>=1; j--)
d[i] = min(d[i], d[j-1]+drept[i].yy*drept[j].xx);
}
cout << d[k];
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |