Advertisement
Guest User

Untitled

a guest
Jul 27th, 2015
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.36 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. #include<stdio.h>
  4. #include<cstdio>
  5. #include<stdlib.h>
  6. #include<string>
  7. #include<string.h>
  8. #include<ctype.h>
  9. #include<algorithm>
  10. #include<cmath>
  11. #include<set>
  12. #include<queue>
  13. #include<assert.h>
  14. #include<stack>
  15. #include<iomanip>
  16. #include<vector>
  17. #include<map>
  18. #define PB(x) push_back(x)
  19. #define MP(x, y) make_pair(x, y)
  20. #define fi first
  21. #define se second
  22. #define ll long long
  23. #define pii pair< int, int >
  24. #define MEM(p, v) memset(p, v, sizeof(p))
  25. #define READ(f) freopen(f, "r", stdin)
  26. #define WRITE(f) freopen(f, "w", stdout)
  27. #define S system("pause")
  28. #define R return(0)
  29. #define INF int(1e9)
  30. #define MAX_5 int(1e5+5)
  31. #define MAX_6 int(1e6+6)
  32. #define ll long long
  33. #define tree int h,int l1,int r1
  34. #define left 2*h,l1,(l1+r1)/2
  35. #define right 2*h+1,(l1+r1)/2+1,r1
  36. #define M int(1e9)
  37. using namespace std;
  38. #define ull unsigned long long
  39. #define N int (1e5+5)
  40. ll p[N],siz[N],qve[N],n,ans,w,SUM;
  41. vector<int>v[N];
  42. set<int>st[N];
  43. pair<pii,int>a[N];
  44. int pp(int a)
  45. {
  46.     return ((p[a]==a)?a:(p[a]=pp(p[a])));
  47. }
  48. void un(int a,int b)
  49. {
  50.      int A=pp(a);
  51.      int B=pp(b);
  52.      
  53.      siz[A]+=siz[B];
  54.      siz[B]=0;
  55.      p[B]=A;
  56. }
  57. int check(int x,int y)
  58. {
  59.      int l=1,r=n,mid,ls=-1;
  60.          
  61.      while(l<=r)
  62.      {
  63.                 mid=l+r;mid/=2;
  64.                
  65.                 if(a[mid].fi.fi==x && a[mid].fi.se==y)ls=a[mid].se;
  66.                
  67.                
  68.                 if(
  69.                      a[mid].fi.fi<x
  70.                            ||
  71.                     (a[mid].fi.fi==x && a[mid].fi.se<y)
  72.                   )
  73.                                   l=mid+1;else r=mid-1;                
  74.      }
  75.      
  76.      w=ls;
  77.      if(ls==-1)return 0;else return 1;
  78. }
  79. int edge(int x,int y)
  80. {
  81.     return(st[x].count(y));
  82. }
  83. void add(int x,int y)
  84. {
  85.     st[x].insert(y);
  86.     st[y].insert(x);
  87.    
  88.     v[x].push_back(y);
  89.     v[y].push_back(x);
  90. }
  91. void build(int x,int p=-1)
  92. {
  93.       qve[x]=siz[x];
  94.       for(int i=0;i<v[x].size();i++)
  95.               if(v[x][i]!=p)
  96.                   build(v[x][i],x),
  97.                   qve[x]+=qve[v[x][i]];
  98.                  
  99.                  
  100. }
  101. void go(int x,int p=-1)
  102. {
  103.      ans+=(1LL*qve[x]*(SUM-qve[x]))%M;
  104.       for(int i=0;i<v[x].size();i++)
  105.               if(v[x][i]!=p)
  106.                   go(v[x][i],x);
  107. }
  108. void aloha()
  109. {
  110.      
  111.     sort(a+1,a+n+1);
  112.    
  113.     for(int i=1;i<=n;i++)p[i]=i,siz[i]=1;
  114.    
  115.    
  116.     for(int i=2;i<=n;i++)
  117.             if(a[i].fi.fi==a[i-1].fi.fi && a[i].fi.se-1==a[i-1].fi.se)
  118.                                   un(a[i-1].se,a[i].se);
  119.                                  
  120.                            
  121.     for(int i=1;i<=n;i++)
  122.     {
  123.             if(check(a[i].fi.fi+1,a[i].fi.se))
  124.                  if(!edge(pp(a[i].se),pp(w)))
  125.                       add(pp(a[i].se),pp(w));
  126.     }
  127.      SUM=0;
  128.     for(int i=1;i<=n;i++)SUM+=siz[i];
  129.     build(pp(1));
  130.     go(pp(1));
  131.          
  132.      
  133.      
  134.      
  135. }
  136. int main(){
  137.    
  138.     cin>>n;
  139.     for(int i=1;i<=n;i++)cin>>a[i].fi.fi>>a[i].fi.se,a[i].se=i;
  140.    
  141.    
  142.     aloha();
  143.    
  144.     for(int i=1;i<=n;i++)swap(a[i].fi.fi,a[i].fi.se);
  145.     for(int i=1;i<=n;i++)
  146.             v[i].clear(),
  147.             st[i].clear();
  148.    
  149.    
  150.     aloha();
  151.    
  152.    
  153.    
  154.    
  155.    
  156.    
  157.    
  158.    
  159.    
  160.    
  161.    
  162.    
  163.    
  164.    
  165.     cout<<ans%M<<endl;
  166.    
  167.    
  168.     cin>>n;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement