1. 程式人生 > 其它 >「BZOJ2131」免費的餡餅 (DP+樹狀陣列) 總算做出來了

「BZOJ2131」免費的餡餅 (DP+樹狀陣列) 總算做出來了

由於未知不穩定因素,在某些評測機上可能有鍋,歡迎指正:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
struct data{
	int t,p,v;
	int fir,sec;
	void push(){
		scanf("%d%d%d",&t,&p,&v);
		t<<=1;
	}
	int count(){
		fir=t+p;
		sec=t-p;
	}
}d[maxn];
bool cmp1(data x,data y){return x.fir<y.fir;}
bool cmp2(data x,data y){return x.sec<y.sec;}
int t[maxn];
int f[maxn];
int c[maxn];
int n;
inline int mymax(int x,int y){return x>y?x:y;}
inline int lowbit(int x){return x&(-x);}
inline void add(int x,int num){
	for(int i=x;i<=n;i+=lowbit(i))c[i]=mymax(c[i],num);
}
inline int ask(int x){
	int res=0;
	for(int i=x;i;i-=lowbit(i))res=mymax(c[i],res);
	return res;
}
int main(){
	int w;
	scanf("%d%d",&w,&n);
	for(int i=1;i<=n;i++){
		d[i].push();
		d[i].count();
	}
	sort(d+1,d+1+n,cmp1);
	int tot=0;
	for(int i=1;i<=n;i++)
		if(d[i].fir!=d[i-1].fir)
			d[i].fir=++tot;
	sort(d+1,d+1+n,cmp2);
	int ans=0;
	for(int i=1;i<=n;i++){
		f[i]=ask(d[i].fir)+d[i].v;
		ans=mymax(ans,f[i]);
		add(d[i].fir,f[i]);
	}
	printf("%d\n",ans);
	return 0;
} 

資料結構優化的DP太難了(T…T)