Advertisement
yicongli

LG5244

Mar 26th, 2019
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=2e5+7;
  17. const int V=1e6+7;
  18. const ll INF=1e18;
  19.  
  20. struct Point{
  21.     int x,y;
  22.     inline bool operator <(const Point &a)const{
  23.         return x==a.x?y<a.y:x<a.x;
  24.     }
  25. }P[N];
  26.  
  27. int c[V];
  28.  
  29. inline void Add(int x,int v){
  30.     for(int i=x;i<V;i+=(i&-i)){
  31.         c[i]=max(c[i],v);
  32.     }
  33. }
  34.  
  35. inline int Max(int x){
  36.     int ret=0;
  37.     for(int i=x;i;i^=(i&-i)){
  38.         ret=max(ret,c[i]);
  39.     }
  40.     return ret;
  41. }
  42.  
  43. #define ls (rt<<1)
  44. #define rs (rt<<1|1)
  45.  
  46. vector<int>Q[N<<2];
  47.  
  48. void build(int rt,int l,int r){
  49.     Q[rt].clear();
  50.     if(l==r)return ;
  51.     int mid=(l+r)>>1;
  52.     build(ls,l,mid);
  53.     build(rs,mid+1,r);
  54. }
  55.  
  56. void insert(int rt,int l,int r,int x,int y,int v){
  57.     if(x<=l&&r<=y){
  58.         Q[rt].push_back(v);
  59.         return ;
  60.     }
  61.     int mid=(l+r)>>1;
  62.     if(x<=mid)insert(ls,l,mid,x,y,v);
  63.     if(y>mid)insert(rs,mid+1,r,x,y,v);
  64. }
  65.  
  66. vector<int>group[N];
  67. vector<ll>dp[N];
  68.  
  69. void solve(vector<int>&T,int l,int r,int x,int y,int id){
  70.     if(l>r)return ;
  71.     int mid=(l+r)>>1;
  72.     ll ret=INF;
  73.     int pos;
  74.     Point A=P[group[id][T[mid]]];
  75.     for(int i=x;i<=y;++i){
  76.         Point B=P[group[id-1][i]];
  77.         ll tmp=dp[id-1][i]+(ll)(A.x-B.x)*(A.y-B.y);
  78.         if(ret>tmp)ret=tmp,pos=i;
  79.     }
  80.     dp[id][T[mid]]=min(dp[id][T[mid]],ret);
  81.     solve(T,l,mid-1,pos,y,id);
  82.     solve(T,mid+1,r,x,pos,id);
  83. }
  84.  
  85. void dfs(int rt,int l,int r,int id){
  86.     solve(Q[rt],0,Q[rt].size()-1,l,r,id);
  87.     if(l==r)return;
  88.     int mid=(l+r)>>1;
  89.     dfs(ls,l,mid,id);
  90.     dfs(rs,mid+1,r,id);
  91. }
  92.  
  93. int f[N];
  94.  
  95. int main(){
  96.     // freopen(".in","r",stdin);
  97.     // freopen(".out","w",stdout);
  98.     int n,T;r(n),r(T);
  99.     for(int i=1;i<=n;++i){
  100.         r(P[i].x),r(P[i].y);
  101.     }
  102.     sort(P+1,P+n+1);
  103.     ++n;
  104.     P[n].x=T;
  105.     P[n].y=T;
  106.     group[0].push_back(0);
  107.     dp[0].push_back(0);
  108.     for(int i=1;i<=n;++i){
  109.         f[i]=Max(P[i].y)+1;
  110.         group[f[i]].push_back(i);
  111.         Add(P[i].y,f[i]);
  112.     }
  113.     for(int i=1;i<=f[n];++i){
  114.         int m=group[i-1].size()-1;
  115.         build(1,0,m);
  116.         for(int j=0,l,r,mid,ans;j<group[i].size();++j){
  117.             dp[i].push_back(INF);
  118.             Point &A=P[group[i][j]];
  119.             l=0,r=m;
  120.             while(l<=r){
  121.                 mid=(l+r)>>1;
  122.                 if(P[group[i-1][mid]].y<=A.y)r=mid-1,ans=mid;
  123.                 else l=mid+1;
  124.             }
  125.             int st=ans;
  126.             l=0,r=m;
  127.             while(l<=r){
  128.                 mid=(l+r)>>1;
  129.                 if(P[group[i-1][mid]].x<=A.x)l=mid+1,ans=mid;
  130.                 else r=mid-1;
  131.             }
  132.             int ed=ans;
  133.             insert(1,0,m,st,ed,j);
  134.         }
  135.         dfs(1,0,m,i);
  136.     }
  137.     printf("%lld\n",dp[f[n]][0]);
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement