求助单调队列
查看原帖
求助单调队列
551803
BPG_ning楼主2022/10/27 10:46
#include<bits/stdc++.h> 
using namespace std;
const int maxn=1010;
struct node{int x,p;}a[maxn];
struct kkk{int h,t,que[maxn];}deq[maxn];
int n,dp[maxn][maxn];
bool cmp1(node a,node b){return a.x<b.x;}
bool cmp2(node a,node b){return a.x>b.x;}
int sb_dp(int cnm){
	if(cnm==1) sort(a+1,a+1+n,cmp2);
	else sort(a+1,a+1+n,cmp1);
	memset(dp,0,sizeof(dp));
	int Max=0;
	for(int i=1;i<=n;i++){
		dp[i][0]=a[i].p;
//		h=t=1;
		for(int j=1;j<i;j++){
//			for(int k=1;k<j;k++) if(abs(a[i].x-a[j].x)>=abs(a[j].x-a[k].x))dp[i][j]=max(dp[i][j],dp[j][k]);
			while(deq[j].h>deq[j].t&&abs(a[i].x-a[j].x)<abs(a[j].x-a[deq[j].que[deq[j].t]].x)) deq[j].t++;
			if(deq[j].h>deq[j].t) dp[i][j]=max(dp[i][j],dp[j][deq[j].t]);
			else dp[i][j]=max(dp[i][j],dp[j][0]);
			dp[i][j]+=a[i].p;
			while(deq[i].h>deq[i].t&&dp[i][j]>dp[i][deq[i].h]) deq[i].h--;
			deq[i].que[++deq[i].h]=j;
			Max=max(Max,dp[i][j]);
		}
	}
//	for(int i=1;i<=n;i++) cout<<a[i].x<<' '<<a[i].p<<endl;
//	cout<<endl;
//	for(int i=1;i<=n;i++){
//		for(int j=0;j<i;j++){
//			cout<<dp[i][j]<<' ';
//		}
//		cout<<endl;
//	}
	return Max;
}
int main(){
	ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	freopen("cnm.in","r",stdin);
	freopen("cnm.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].p;
	cout<<max(sb_dp(1),sb_dp(2));
	return 0;
}
2022/10/27 10:46
加载中...