Advertisement
SuitNdtie

Thailand 4.0

May 31st, 2019
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.99 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<set>
  3. #include<algorithm>
  4. using namespace std;
  5.  
  6.  
  7.  
  8. typedef long long int ll;
  9. int main()
  10. {
  11.     int n;
  12.     scanf("%d",&n);
  13.     pair<pair<ll,int>,int> Xevn[n*2];
  14.     pair<ll,ll> Yarr[n];
  15.     for(int i = 0 ; i < n ; i ++){
  16.         ll a,b,c,d;
  17.         scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
  18.         Xevn[i]   = {{a,i},+1};
  19.         Xevn[i+n] = {{b,i},-1};
  20.         Yarr[i] = {c,d};
  21.     }
  22.     sort(Xevn , Xevn + n*2);
  23.     multiset<pair<pair<ll,int>,int > > mset;
  24.     ll ans = 0;
  25.     for(int i = 0 ; i < n*2 - 1; i ++){
  26.         int idx = Xevn[i].first.second;
  27.         ll Xa = Xevn[i].first.first;
  28.         ll Xb = Xevn[i+1].first.first;
  29.         int Xstate = Xevn[i].second;
  30.         if(Xstate == 1){
  31.             mset.insert({{Yarr[idx].first ,idx},1});
  32.             mset.insert({{Yarr[idx].second,idx},-1});
  33.         }
  34.         else if(Xstate == -1){
  35.             std::multiset<pair<pair<ll,int>,int > >::iterator its = mset.find({{Yarr[idx].first ,idx},1});
  36.             mset.erase(its);
  37.             its = mset.find({{Yarr[idx].second ,idx},-1});
  38.             mset.erase(its);
  39.         }
  40.         ll cal = 0;
  41.         ll L = 1e9+10,R = -1;
  42.         ll dense = 0;
  43.         std::multiset<pair<pair<ll,int>,int > >::iterator its = mset.begin();
  44.      //   printf("Test i #%d Xl = [%lld,%lld) : \n",i,Xa,Xb);
  45.         while(its != mset.end()){
  46.             ll Yv = its->first.first;
  47.             int Ystate = its->second;
  48.             if(Ystate == 1){
  49.                 L = min(L,Yv);
  50.             }else if(Ystate == -1){
  51.                 R = max(R,Yv);
  52.             }
  53.             dense += Ystate;
  54.             if(dense == 0){
  55.             //    printf("Y-axis : block at [%lld,%lld)\n",L,R);
  56.                 cal += R - L;
  57.                 L = 1e9+10;
  58.                 R = -1;
  59.             }
  60.             ++its;
  61.         }
  62.       //  printf("Plus : %lld + %lld = %lld\n",ans,(Xb - Xa)*cal,ans+(Xb-Xa)*cal);
  63.         ans += (Xb - Xa) * cal;
  64.     }
  65.     printf("%lld",ans);
  66.     return 0;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement