1560: [JSOI2009]火星藏宝图
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 729 Solved: 352
[ Submit][ Status][ Discuss]
Description
Input
Output
Sample Input
4 10
1 1 20
10 10 10
3 5 60
5 3 30
1 1 20
10 10 10
3 5 60
5 3 30
Sample Output
-4
HINT
Source
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<bitset>
#include<algorithm>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#include<cmath>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
const int maxm = 1E3 + 10;
const int maxn = 2E5 + 20;
const int Neg = -(~0U>>1);
struct Point{
int x,y,va;
Point (int _x = 0,int _y = 0,int _va = 0) {x = _x; y = _y; va = _va;}
bool operator < (const Point &b) const {
if (x < b.x) return 1;
if (x > b.x) return 0;
return y < b.y;
}
}p[maxn];
int n,m,f[maxn],h[maxm];
vector <int> v[maxm];
int cal(int x,int y)
{
int A = p[x].x - p[y].x;
int B = p[x].y - p[y].y;
return A*A + B*B;
}
int main()
{
#ifdef DMC
freopen("DMC.txt","r",stdin);
#endif
cin >> n >> m;
int tx,ty; tx = ty = 0;
for (int i = 1; i <= n; i++) {
int x,y,w; scanf("%d%d%d",&x,&y,&w);
p[i] = Point(x,y,w);
tx += x; ty += y;
}
//if (ty > tx) for (int i = 2; i < n; i++) swap(p[i].x,p[i].y);
sort(p + 1,p + n + 1);
for (int i = 1; i <= n; i++) {
v[p[i].x].push_back(i);
f[i] = p[i].va + p[1].va - cal(1,i);
}
f[1] = p[1].va;
for (int i = 1; i <= m; i++) {
if (!v[i].size()) continue;
for (int j = 0; j < v[i].size(); j++) {
int now = v[i][j];
for (int l = p[now].y; l; l--) {
if (!h[l]) continue;
int modi = f[h[l]] + p[now].va - cal(h[l],now);
f[now] = max(f[now],modi);
}
h[p[now].y] = now;
}
}
cout << f[n];
return 0;
}