博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Infinite Inversions(树状数组+离散化)
阅读量:5009 次
发布时间:2019-06-12

本文共 2277 字,大约阅读时间需要 7 分钟。

思路及代码参考:

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 aand 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 swapoperations 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
2 4 2 1 4
Output
4
Input
3 1 6 3 4 2 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).

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
const int maxn=2e5+5;typedef long long ll;using namespace std;ll s[maxn],sum[maxn];int ss[maxn];int a[maxn],b[maxn],pos[maxn];int lowbit(int x){ return x&(-x);}int n;void update(int pos,int ad){ while(pos<=maxn) { s[pos]+=ad; pos+=lowbit(pos); }}ll getnum(int pos){ ll res=0; while(pos>0) { res+=s[pos]; pos-=lowbit(pos); } return res;}int main(){ int n; while (~scanf("%d", &n)) { for (int i = 1; i <= n; i++) { scanf("%d%d", &a[i], &b[i]); ss[i] = a[i]; ss[i + n] = b[i]; pos[i] = i; pos[i + n] = i + n; } sort(ss + 1, ss + 2 * n + 1); ss[0] = 0; int cnt = 0; for (int i = 1; i <= 2 * n;i++) if (i == 1 || ss[i] != ss[i - 1]) ss[++cnt] = ss[i]; sum[0] = 0; for (int i = 1; i <= cnt; i++) sum[i] = sum[i - 1] + ss[i] - ss[i - 1] - 1; for (int i = 1; i <= n; i++) { int aa = lower_bound(ss + 1, ss + cnt + 1, a[i]) - ss; int bb = lower_bound(ss + 1,ss + cnt + 1, b[i]) - ss; swap(pos[aa], pos[bb]); } memset(s, 0, sizeof(s)); ll ans = 0; for (int i = cnt; i; i--) { ans += getnum(pos[i]); ans += abs(sum[i]-sum[pos[i]]); update(pos[i], 1); } printf("%lld\n", ans); } return 0;}

 

转载于:https://www.cnblogs.com/Staceyacm/p/11312245.html

你可能感兴趣的文章
html5——动画案例(时钟)
查看>>
调用Android系统“应用程序信息(Application Info)”界面
查看>>
ios中用drawRect方法绘图的时候设置颜色
查看>>
数据库中的外键和主键理解
查看>>
个人博客03
查看>>
Expression<Func<T,TResult>>和Func<T,TResult>
查看>>
文件缓存
查看>>
关于C语言中return的一些总结
查看>>
Codeforces Round #278 (Div. 2)
查看>>
51. N-Queens
查看>>
Linux 命令 - 文件搜索命令 locate
查看>>
[Grunt] grunt.template
查看>>
Ubuntu最小化桌面快捷键Super+D不生效解决
查看>>
Cookie&Session会话跟踪技术
查看>>
UNIX环境高级编程 第17章 高级进程间通信
查看>>
ES的Zen发现机制
查看>>
【hibernate】1、Hibernate的一个注解 @Transient
查看>>
HihoCoder 1877 - Approximate Matching
查看>>
Elastic Search 语法总结
查看>>
py自动化之环境配置
查看>>