Submit Time:2023-01-23 13:20:12

运行 ID: 68057

#include<bits/stdc++.h> using namespace std; const int MAXN = 2010; struct node{ int x,y; }a[MAXN]; vector<long long> w[MAXN],_w[MAXN],ly; long long f[MAXN],ans[MAXN]; int lst[MAXN]; int INF=0x3f3f3f3f; int main(){ // freopen("boom.in","r",stdin); // freopen("boom.out","w",stdout); int n; scanf("%d", &n); for(int i=1;i<=n;i++){ scanf("%d%d", &a[i].x, &a[i].y); ly.push_back(a[i].y); } sort(ly.begin(),ly.end()); int ks=unique(ly.begin(),ly.end())-ly.begin(); for(int i=1;i<=n;i++){ int t=lower_bound(ly.begin(),ly.begin()+ks,a[i].y)-ly.begin(); if(a[i].x>=0)w[t].push_back(a[i].x); else _w[t].push_back(-a[i].x); } for(int i=0;i<ks;i++)sort(w[i].begin(),w[i].end()); for(int i=0;i<ks;i++)sort(_w[i].begin(),_w[i].end()); memset(f,0x3f,sizeof(f)); memset(ans,0x3f,sizeof(ans)); f[0]=0; for(int i=0;i<ks;i++){ memset(lst,0x3f,sizeof(lst)); for(int j=n;j>0;j--){ for(int k=0;k<w[i].size();k++) if(j>=k+1&&f[j]>f[j-k-1]+w[i][k]*2){ lst[j]=k; f[j]=f[j-k-1]+w[i][k]*2; ans[j]=min(ans[j],f[j]+ly[i]-w[i][k]); } } for(int j=n;j>0;j--){ for(int k=0;k<_w[i].size();k++){ if(j>=k+1&&f[j]>f[j-k-1]+_w[i][k]*2){ f[j]=f[j-k-1]+_w[i][k]*2; ans[j]=min(ans[j],f[j]+ly[i]-_w[i][k]); if(lst[j-k-1]!=INF)ans[j]=min(ans[j],f[j]+ly[i]-w[i][lst[j-k-1]]); } } } } memset(f,0x3f,sizeof(f)); f[0]=0; for(int i=0;i<ks;i++){ memset(lst,0x3f,sizeof(lst)); for(int j=n;j>0;j--){ for(int k=0;k<_w[i].size();k++){ if(j>=k+1&&f[j]>f[j-k-1]+_w[i][k]*2){ f[j]=f[j-k-1]+_w[i][k]*2; ans[j]=min(ans[j],f[j]+ly[i]-_w[i][k]); if(lst[j-k-1]!=INF)ans[j]=min(ans[j],f[j]+ly[i]-w[i][lst[j-k-1]]); } } } for(int j=n;j>0;j--){ for(int k=0;k<w[i].size();k++) if(j>=k+1&&f[j]>f[j-k-1]+w[i][k]*2){ lst[j]=k; f[j]=f[j-k-1]+w[i][k]*2; ans[j]=min(ans[j],f[j]+ly[i]-w[i][k]); } } } for(int i=1;i<=n;i++)printf("%lld\n", ans[i]); return 0; }