#include <bits/stdc++.h>
#define maxn 100005
using 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;
}
Codeforces Round #301 (Div. 2)-E. Infinite Inversions
最新推荐文章于 2022-11-22 23:15:14 发布