Codeforces Round #301 (Div. 2)-E. Infinite Inversions

来源:互联网 发布:网络割接回退方案 编辑:程序博客网 时间:2024/04/19 23:20

原题链接

E. Infinite Inversions
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

There is an infinite sequence consisting of all positive integers in the increasing order: p = {1, 2, 3, ...}. We performed n swap operations with this sequence. A swap(a, b) is an operation of swapping the elements of the sequence on positions a and b. Your task is to find the number of inversions in the resulting sequence, i.e. the number of such index pairs (i, j), that i < j and pi > pj.

Input

The first line contains a single integer n (1 ≤ n ≤ 105) — the number of swap operations applied to the sequence.

Each of the next n lines contains two integers ai and bi (1 ≤ ai, bi ≤ 109ai ≠ bi) — the arguments of the swap operation.

Output

Print a single integer — the number of inversions in the resulting sequence.

Examples
input
24 21 4
output
4
input
31 63 42 5
output
15
Note

In the first sample the sequence is being modified as follows: . It has 4 inversions formed by index pairs (1, 4)(2, 3)(2, 4) and (3, 4).


用map显示操作完后最后的数字序列,对于每个数字m,有m-1个数字比他小,找到在他之前有p个数字比他小,那么ans+= m - 1 - p,这是基本思路.具体看代码
#include <bits/stdc++.h>#define maxn 100005using namespace std;typedef long long ll;struct Node{Node(){}Node(int a, int b){m = a;num = b;}friend bool operator < (const Node&a, const Node&b){return a.m < b.m;}int m, num;};int sum[maxn<<2];Node v1[maxn<<2], v2[maxn<<2];int cnt = 0;map<int, int>m;void Update(int j, int f){int i = j;while(i <= cnt){sum[i] += v1[f].num;i += i & -i;}}int Query(int j){int s = 0;while(j){s += sum[j];j -= j & -j;}return s;}int main(){//freopen("in.txt", "r", stdin);int n, a, b;scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%d%d", &a, &b);int k1 = m[a], k2 = m[b];if(k1 == 0) k1 = a;if(k2 == 0) k2 = b;m[a] = k2;m[b] = k1;}map<int, int> ::iterator iter = m.begin(), kk;if(iter->first != 1){v1[++cnt] = Node(1, (iter->first)-1);v2[cnt] = v1[cnt]; }for(; iter != m.end(); iter++){    v1[++cnt] = Node(iter->second, 1);    v2[cnt] = v1[cnt];kk = iter;kk++;if(kk != m.end() && (kk->first) - (iter->first) != 1){v1[++cnt] = Node((iter->first)+1, (kk->first)-(iter->first)-1);v2[cnt] = v1[cnt]; }} ll ans = 0;sort(v2+1, v2+1+cnt);for(int i = 1; i <= cnt; i++){int l = 1, r = cnt + 1;while(l < r){int mid = (l + r) >> 1;if(v2[mid].m >= v1[i].m) r = mid;else l = mid + 1;}ans += (ll)(v1[i].m - 1 - Query(l-1)) * v1[i].num;Update(l, i);}printf("%I64d\n", ans);return 0;}


0 0