Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<set>
- #include<algorithm>
- using namespace std;
- typedef long long int ll;
- int main()
- {
- int n;
- scanf("%d",&n);
- pair<pair<ll,int>,int> Xevn[n*2];
- pair<ll,ll> Yarr[n];
- for(int i = 0 ; i < n ; i ++){
- ll a,b,c,d;
- scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
- Xevn[i] = {{a,i},+1};
- Xevn[i+n] = {{b,i},-1};
- Yarr[i] = {c,d};
- }
- sort(Xevn , Xevn + n*2);
- multiset<pair<pair<ll,int>,int > > mset;
- ll ans = 0;
- for(int i = 0 ; i < n*2 - 1; i ++){
- int idx = Xevn[i].first.second;
- ll Xa = Xevn[i].first.first;
- ll Xb = Xevn[i+1].first.first;
- int Xstate = Xevn[i].second;
- if(Xstate == 1){
- mset.insert({{Yarr[idx].first ,idx},1});
- mset.insert({{Yarr[idx].second,idx},-1});
- }
- else if(Xstate == -1){
- std::multiset<pair<pair<ll,int>,int > >::iterator its = mset.find({{Yarr[idx].first ,idx},1});
- mset.erase(its);
- its = mset.find({{Yarr[idx].second ,idx},-1});
- mset.erase(its);
- }
- ll cal = 0;
- ll L = 1e9+10,R = -1;
- ll dense = 0;
- std::multiset<pair<pair<ll,int>,int > >::iterator its = mset.begin();
- // printf("Test i #%d Xl = [%lld,%lld) : \n",i,Xa,Xb);
- while(its != mset.end()){
- ll Yv = its->first.first;
- int Ystate = its->second;
- if(Ystate == 1){
- L = min(L,Yv);
- }else if(Ystate == -1){
- R = max(R,Yv);
- }
- dense += Ystate;
- if(dense == 0){
- // printf("Y-axis : block at [%lld,%lld)\n",L,R);
- cal += R - L;
- L = 1e9+10;
- R = -1;
- }
- ++its;
- }
- // printf("Plus : %lld + %lld = %lld\n",ans,(Xb - Xa)*cal,ans+(Xb-Xa)*cal);
- ans += (Xb - Xa) * cal;
- }
- printf("%lld",ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement