Guest User

Untitled

a guest
May 20th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <string>
  6. #include <set>
  7. using namespace std;
  8. #define N 222222
  9. int n;
  10. int s[N], place[N];
  11. int ev[N];
  12. struct cell {
  13.     int num,len;
  14.        
  15.     bool operator <(const cell& A) const {
  16.         return len < A.len;
  17.     }
  18. } a[N];
  19.  
  20. int prev(int x) {
  21.     return x & (x - 1);
  22. }
  23. int next(int x) {
  24.     return x + x - prev(x);
  25. }
  26.  
  27. void modify(int x, int v) {
  28.     for (; x <= n+n; x = next(x)) s[x] += v;
  29. }
  30.  
  31. int findsum(int x) {
  32.     int ans = 0;
  33.     for (; x; x = prev(x)) ans += s[x];
  34.     return ans;
  35. }
  36.  
  37. int main() {
  38.     freopen("taxibus.in", "r", stdin);
  39.     freopen("taxibus.out", "w", stdout);
  40.    
  41.     scanf("%d", &n);
  42.    
  43.     for (int i = 1; i <= n; ++i) {
  44.         int x,y;
  45.         scanf("%d%d",&x,&y);
  46.         ev[x] = i;
  47.         ev[y] = -i;
  48.         a[i].num = i;
  49.         a[i].len = y - x;
  50.     }
  51.    
  52.     sort(a + 1, a + n + 1);
  53.     for (int i = 1; i <= n; ++i) place[ a[i].num ] = i;
  54.    
  55.     long long ans = 0;
  56.     for (int i = 1; i <= n+n; ++i) {
  57.         if (ev[i] < 0) {
  58.             modify(place[ -ev[i] ], -1);
  59.             ans += findsum( place[ -ev[i] ] );
  60.         } else {
  61.             ans += findsum( place[ ev[i] ] );
  62.             modify(place[ ev[i] ], 1);
  63.         }
  64.     }
  65.    
  66.     cout << ans << endl;
  67.     for (int i = 1; i <= n; ++i) printf("%d ", place[i]);
  68.     cout << endl;
  69.    
  70.     return 0;
  71. }
Add Comment
Please, Sign In to add comment