http://www.lydsy.com/JudgeOnline/problem.php?id=1537
水题一道,不过zky神犇的代码果然与众不同,模(chao)仿(xi)了下
//#define _TEST _TEST #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <cmath> #include <algorithm> #include <map> using namespace std; /************************************************ Code By willinglive ************************************************/ ///////////////////////////////////////////////// #define rep(i,l,r) for(int i=l,___t=(r);i<=___t;i++) #define per(i,r,l) for(int i=r,___t=(l);i>=___t;i--) #define MS(arr,x) memset(arr,x,sizeof(arr)) #define LL long long #define INE(i,u,e) for(int i=head[u];~i;i=e[i].next) inline const int getint() { int r=0,k=1;char c=getchar(); for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1; for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0'; return k*r; } ///////////////////////////////////////////////// int n,m,k; struct point { int x,y,p; }pt[100010]; map<int,int>M; int c[100010]; int dp[100010]; ///////////////////////////////////////////////// bool cmp(const point &a,const point &b) {return a.y==b.y?a.x<b.x:a.y<b.y;} void add(int id,int x){for(;id<=k;id+=id&-id)if(c[id]<x)c[id]=x;} int query(int id){int res=0;for(;id>0;id-=id&-id)if(res<c[id])res=c[id];return res;} ///////////////////////////////////////////////// void input() { scanf("%d%d%d",&n,&m,&k); rep(i,1,k) pt[i].x=getint(),pt[i].y=getint(),pt[i].p=getint(), M[pt[i].x]=1; } void solve() { sort(&pt[1],&pt[k+1],cmp); int cnt=0; for(map<int,int>::iterator it=M.begin();it!=M.end();it++) it->second=++cnt; rep(i,1,k) pt[i].x=M[pt[i].x]; rep(i,1,k) { dp[i]=query(pt[i].x)+pt[i].p; add(pt[i].x,dp[i]); } printf("%d\n",*max_element(dp+1,dp+1+k)); } ///////////////////////////////////////////////// int main() { #ifndef _TEST freopen("std.in","r",stdin); freopen("std.out","w",stdout); #endif input(); solve(); return 0; }