Infinite Inversions(树状数组+离散化)
思路及代码参考:https://blog.csdn.net/u014800748/article/details/45420085
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 ≤ 109, ai ≠ bi) — the arguments of the swap operation.
Output
Print a single integer — the number of inversions in the resulting sequence.
Examples
2
4 2
1 4
4
3
1 6
3 4
2 5
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<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<stack> #include<set> #include<vector> #include<cmath> 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
- Redis 在Centos Linux 上的启动脚本
- 理解JavaScript的临时包装对象
- JavaScript实现私有属性
- 使用LRU算法缓存图片,android 3.0
- 深入理解JavaScript原型:prototype,__proto__和constructor
- Comparable 与 Comparator 浅析
- 必应首页平铺背景图片的实现方案
- 我们是如何优化HAProxy以让其支持200万个并发SSL连接的?
- 【译】《Understanding ECMAScript6》- 第八章-Module
- 【译】《Understanding ECMAScript6》- 第七章-Promise
- 自定义gradview
- Redis 起步
- JVM参数详解及OOM
- 【译】《Understanding ECMAScript6》- 第五章-Class
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用React-Router实现前端路由鉴权
- 手写React-Router源码,深入理解其原理
- 深入Node.js的模块加载机制,手写require函数
- Redux异步解决方案之Redux-Thunk原理及源码解析
- MySQL设计与优化
- Elasticsearch学习笔记
- 《springboot实战》
- 360全国大学生信安技术大赛记录
- gh0st源码分析与远控的编写(四)
- 记一次Elasticsearch优化总结
- unix环境高级编程(上)-文件篇
- php webshell下直接反弹shell(不借助任何其他语言)
- XssHtml – 基于白名单的富文本XSS过滤类
- unix环境高级编程(下)-高级IO和进程间通信篇
- mybatis原理,配置介绍及源码分析