1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #define rep(i,x,y) for(register int i=x;i<=y;++i) #define repd(i,x,y) for(register int i=x;i>=y;--i) #define ll long long #define xx(i) a[i].first #define yy(i) a[i].second using namespace std; const int N=1e5+7; typedef pair<int,int> s; s b[N],a[N]; ll dp[107][N]; int n,nn,m,q[N]; inline int (s x,s y){return x.first==y.first?x.second>y.second:x.first>y.first;} inline ll Y(int x,int y,int c){return dp[c][x]-dp[c][y];} inline ll X(int x,int y){return 1LL*xx(y+1)-xx(x+1);} int main(){ while(~scanf("%d%d",&nn,&m)){ int l=1,r=1;n=0; rep(i,1,nn)scanf("%d%d",&b[i].first,&b[i].second); sort(b+1,b+nn+1,cmp); while(l<=nn){ r=l+1; while(r<=nn&&b[l].second>=b[r].second) ++r; a[++n]=b[l]; l=r; } rep(i,1,n)dp[1][i]=1LL*xx(1)*yy(i); ll ans=dp[1][n]; rep(j,2,m){ int head=1,tail=1; rep(i,1,n){ while(head<tail&&Y(q[head+1],q[head],j-1)<=X(q[head+1],q[head])*yy(i))++head; dp[j][i]=dp[j-1][q[head]]+1LL*xx(q[head]+1)*yy(i); while(head<tail&&Y(q[tail],i,j-1)*X(q[tail-1],q[tail])<=Y(q[tail-1],q[tail],j-1)*X(q[tail],i))--tail; q[++tail]=i; } if(ans<=dp[j][n])break; else ans=dp[j][n]; } printf("%lldn",ans); } return 0; }
|
近期评论