1560: [JSOI2009]火星藏宝图
2017-03-25 09:08
351 查看
题目链接
题目大意:给定一个m*m的矩阵,上面有n个点,每个点上有一个正的收益,在两个点之间走的代价是距离的平方,求(1,1)到(m,m)的最大收益
题解:可以直接排序dp,O(n2)过不了
对于一个点C(x,y),如果其左上方有B(x1,y1),A(x1,y2),且
A在B上方,在a,b>0时,有a2+b2≤(a+b)2
可知A→C不会比A→B→C优
对于A之前的每一列,只有行最靠近A的能对A贡献,反之亦然
设pos[i]表示第i列最靠下那行的位置,f[i]表示(pos[i],i)的值
以 行 为第一关键值,列 为第二关键值排序。
这样枚举列的时候,就保证了行是一定比这个点小的。
复杂度O(mn)
我的收获:Orz
题目大意:给定一个m*m的矩阵,上面有n个点,每个点上有一个正的收益,在两个点之间走的代价是距离的平方,求(1,1)到(m,m)的最大收益
题解:可以直接排序dp,O(n2)过不了
对于一个点C(x,y),如果其左上方有B(x1,y1),A(x1,y2),且
A在B上方,在a,b>0时,有a2+b2≤(a+b)2
可知A→C不会比A→B→C优
对于A之前的每一列,只有行最靠近A的能对A贡献,反之亦然
设pos[i]表示第i列最靠下那行的位置,f[i]表示(pos[i],i)的值
以 行 为第一关键值,列 为第二关键值排序。
这样枚举列的时候,就保证了行是一定比这个点小的。
复杂度O(mn)
我的收获:Orz
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int M=200005; #define INF 0x3f3f3f3f int n,m,pos[M],f[M]; struct node{int x,y,w;}a[M]; bool cmp(node a,node b){return a.x<b.x||(a.x==b.x&&a.y<b.y);} int cal(int x1,int y1,int x2,int y2){return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);} void work() { for(int i=1;i<=n;i++){ int t=-INF; for(int j=1;j<=a[i].y;j++) if(pos[j]) t=max(t,f[j]-cal(a[i].x,a[i].y,pos[j],j)); pos[a[i].y]=a[i].x;f[a[i].y]=t+a[i].w; } printf("%d\n",f[m]); } void init() { cin>>n>>m; for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w); sort(a+1,a+1+n,cmp); f[1]=0;pos[1]=1; } int main() { init(); work(); return 0; }
相关文章推荐
- BZOJ 1560 [JSOI2009] 火星藏宝图
- BZOJ 1560 JSOI2009 火星藏宝图 动态规划
- 【BZOJ1560】【JSOI2009】火星藏宝图 动规
- bzoj1560:[JSOI2009]火星藏宝图(斜率优化)
- bzoj 1560 [JSOI2009]火星藏宝图(DP)
- 1560: [JSOI2009]火星藏宝图
- 【BZOJ1560】【JSOI2009】火星藏宝图 [DP]
- bzoj 1560 [JSOI2009]火星藏宝图
- bzoj 1560 [JSOI2009]火星藏宝图(DP)
- bzoj1560: [JSOI2009]火星藏宝图
- bzoj1560 [JSOI2009]火星藏宝图(dp+贪心)
- bzoj1560 [JSOI2009]火星藏宝图
- 【bzoj1560】【jsoi2009】【火星藏宝图】【dp】
- [BZOJ]1560: [JSOI2009]火星藏宝图 DP
- 【BZOJ1560】[JSOI2009]火星藏宝图【DP】
- BZOJ1560: [JSOI2009]火星藏宝图
- BZOJ 1560 火星藏宝图(DP)
- BZOJ 1560 火星藏宝图(DP)
- bzoj1449/2895[JSOI2009]球队收益
- [JSOI2009]等差数列【差分+线段树】