提交时间:2023-01-19 22:51:03

运行 ID: 67843

#include<iostream> #include<cstdio> #include<cstring> #include<climits> #include<algorithm> #define elif else if #define ll long long using namespace std; ll Abs(int x) { return x>0?x:-x; } ll read() { ll o=0,w=1;char c=getchar(); while(c>'9'||c<'0') { if(c=='-') w=-1; c=getchar(); } while(c>='0'&&c<='9') { o=o*10+c-'0'; c=getchar(); } return o*w; } const int N=2001,M=2001; int n; struct node { ll x,y; ll sum; ll bt;//在哪个块 }d[N]; ll dp[N][N]; ll maxx[N][M]; bool cmp(node a,node b) { if(a.y==b.y) return a.x<b.x; return a.y<b.y; } bool cmp1(node a,node b) { if(a.y==b.y) { if((a.x<0&&b.x<0)||(a.x>0||b.x>0)) { return Abs(a.x)<Abs(b.x); } return a.x<b.x; } return a.y<b.y; } int main() { // freopen("boom.in","r",stdin); // freopen("boom.out","w",stdout); cin>>n; for(int i=1;i<=n;i++) { cin>>d[i].x>>d[i].y; d[i].sum=1; } sort(d+1,d+1+n,cmp); int cnt=0; for(int i=1,j=1;i<=n;i=j+1) { cnt++; j=i; while(d[j].y==d[i].y&&(!((d[j].x<0)^(d[i].x<0)))) j++; j--; if(d[i].x>0) { d[i].bt=cnt; for(int k=i+1;k<=j;k++) { d[k].sum=d[k-1].sum+1; d[k].bt=cnt; } } else { d[j].bt=cnt; for(int k=j-1;k>=i;k--) { d[k].sum=d[k+1].sum+1; d[k].bt=cnt; } } } sort(d+1,d+1+n,cmp1); memset(dp,0x3f,sizeof(dp)); memset(maxx,0x3f,sizeof(maxx)); maxx[0][0]=0; for(int i=1;i<=n;i++) { maxx[i][0]=0; for(int j=n;j>=d[i].sum;j--) { dp[i][j]=maxx[d[i].bt-1][j-d[i].sum]+Abs(d[i].x)*2; maxx[d[i].bt][j]=min(maxx[d[i].bt][j],min(maxx[d[i].bt-1][j],dp[i][j])); } } ll ans=0x3f3f3f3f3f3f3f3f; for(int j=1;j<=n;j++) { ans=0x3f3f3f3f3f3f3f3f; for(int i=1;i<=n;i++) { ans=min(ans,dp[i][j]-Abs(d[i].x)+d[i].y); } cout<<ans<<'\n'; } return 0; }