- P3431 [POI2005]AUT-The Bus
- 思路 :路线是向右上方运动的。我们首先对y排序,离散化.然后很容易发现,我们的状态转移为
- f [ i ] = f [ j ] + v a l [ i ] ( x [ i ] > x [ j ] & & y [ i ] > y [ j ] ),这时候维护当前位置之前的最大值即可.
- 按x进行排序 ,树状数组查询 1 - y [ i ] 最值,并不断更新即可。
-
#include<bits/stdc++.h> using namespace std; #define maxn 123456 #define lowbit(x) x&-x int n,m,k,ans,now,cnt; int tree[maxn]; struct node { int x,y,w; } a[maxn]; bool cmp1(node c,node d) { return c.y<d.y; } bool cmp2(node c,node d) { if(c.x==d.x)return c.y<d.y; return c.x<d.x; } void updata(int x,int y) { while(x<=cnt) { tree[x]=max(tree[x],y); x+=lowbit(x); } } int query(int x) { int ret=0; while(x) { ret=max(ret,tree[x]); x-=lowbit(x); } return ret; } int main() { now=cnt=ans=0; scanf("%d%d%d",&n,&m,&k); for(int i=0; i<k; i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w); sort(a,a+k,cmp1); for(int i=0; i<k; i++) { if(a[i].y>now) { now=a[i].y; cnt++; } a[i].y=cnt; } sort(a,a+k,cmp2); for(int i=0; i<k; i++) { now=query(a[i].y)+a[i].w; updata(a[i].y,now); ans=max(ans,now); } printf("%d\n",ans); return 0; }
P3431 [POI2005]AUT-The Bus-二维偏序DP
最新推荐文章于 2021-09-04 00:09:18 发布