Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <stdio.h>
- #include <math.h>
- #include <string>
- #include <set>
- using namespace std;
- #define N 222222
- int n;
- int s[N], place[N];
- int ev[N];
- struct cell {
- int num,len;
- bool operator <(const cell& A) const {
- return len < A.len;
- }
- } a[N];
- int prev(int x) {
- return x & (x - 1);
- }
- int next(int x) {
- return x + x - prev(x);
- }
- void modify(int x, int v) {
- for (; x <= n+n; x = next(x)) s[x] += v;
- }
- int findsum(int x) {
- int ans = 0;
- for (; x; x = prev(x)) ans += s[x];
- return ans;
- }
- int main() {
- freopen("taxibus.in", "r", stdin);
- freopen("taxibus.out", "w", stdout);
- scanf("%d", &n);
- for (int i = 1; i <= n; ++i) {
- int x,y;
- scanf("%d%d",&x,&y);
- ev[x] = i;
- ev[y] = -i;
- a[i].num = i;
- a[i].len = y - x;
- }
- sort(a + 1, a + n + 1);
- for (int i = 1; i <= n; ++i) place[ a[i].num ] = i;
- long long ans = 0;
- for (int i = 1; i <= n+n; ++i) {
- if (ev[i] < 0) {
- modify(place[ -ev[i] ], -1);
- ans += findsum( place[ -ev[i] ] );
- } else {
- ans += findsum( place[ ev[i] ] );
- modify(place[ ev[i] ], 1);
- }
- }
- cout << ans << endl;
- for (int i = 1; i <= n; ++i) printf("%d ", place[i]);
- cout << endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment