POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
题意分析
前置技能
线段树求逆序对
离散化
- 线段树求逆序对已经说过了,具体方法请看这里
- 离散化
有些数据本身很大,自身无法作为数组的下标保存对应的属性。
如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理!
当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。例如:
9 1 0 5 4 与 5 2 1 4 3 的逆序对个数相同。
设有4个数:
1234567、123456789、12345678、123456
排序:123456<1234567<12345678<123456789
=> 1 < 2 < 3 < 4
那么这4个数可以表示成:2、4、3、1
需要注意就是ans会爆int,long long 比较稳
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxn 500105
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define ll long long
using namespace std;
int Sum[maxn<<2];
struct temp{
int v;
int pos;
}x[maxn];
int N;
bool cmp(temp a ,temp b)
{
if(a.v<b.v) return true;
else return false;
}
bool cmp2(temp a, temp b)
{
return a.pos < b.pos;
}
void PushUp (int rt){
Sum[rt]=Sum[rt<<1]+Sum[rt<<1|1];
}
void Build(int l,int r,int rt){
if(l==r) {
Sum[rt] = 0;
return;
}
int m=(l+r)>>1;
Build(l,m,rt<<1);
Build(m+1,r,rt<<1|1);
PushUp(rt);
}
void UpdatePoint(int L,int l,int r,int rt){
if(l==r){
Sum[rt]++;
return;
}
int m=(l+r)>>1;
if(L <= m) UpdatePoint(L,l,m,rt<<1);
else UpdatePoint(L,m+1,r,rt<<1|1);
PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt){
if(L <= l && r <= R){
return Sum[rt];
}
int m = (l+r)>>1;
int ANS = 0;
if(L <= m) ANS += Query(L,R,l,m,rt<<1);
if(R > m) ANS += Query(L,R,m+1,r,rt<<1|1);
return ANS;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&N)!=EOF && N){
ll sum = 0;
memset(Sum,0,sizeof Sum);
memset(x,0,sizeof x);
Build(1,maxn,1);
for(int i = 0;i<N;++i){
scanf("%d",&x[i].v);
x[i].pos = i+1;
}
sort(x,x+N,cmp);
for(int i = 0;i<N;++i) x[i].v = i+1;
sort(x,x+N,cmp2);
for(int i = 0;i<N;++i){
sum += Query(x[i].v+1,maxn,1,maxn,1);
UpdatePoint(x[i].v,1,maxn,1);
}
printf("%I64d\n",sum);
}
return 0;
}
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)的更多相关文章
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- hdu 1166线段树 单点更新 区间求和
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu1166(线段树单点更新&区间求和模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:中文题诶- 思路:线段树单点更新,区间求和模板 代码: #include <iost ...
- hdu1394(枚举/树状数组/线段树单点更新&区间求和)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...
- poj 2892---Tunnel Warfare(线段树单点更新、区间合并)
题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...
- hdu2795(线段树单点更新&区间最值)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题意:有一个 h * w 的板子,要在上面贴 n 条 1 * x 的广告,在贴第 i 条广告时要 ...
- POJ 2892 Tunnel Warfare(线段树单点更新区间合并)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7876 Accepted: 3259 D ...
- HDU 3308 LCIS(线段树单点更新区间合并)
LCIS Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting ...
随机推荐
- Redis主从复制(Master/Slave) 与哨兵模式
Redis主从复制是什么? 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 Redis主从复制 ...
- 概念这种东西--node.js
概念是一个既简单又复杂.既招人爱又招人恨的东西.概念是对一事务或现象的抽象.抽象好了,那就太方便问题的解决了,抽象坏了,那就驴唇不对马嘴,反而会让逻辑一塌糊涂.现实中经常有这样的概念:东北人怎么怎么样 ...
- 1.5 JAVA的高并发编程
一.多线程的基本知识 1.1进程与线程的介绍(上个博客1.4中已经详细介绍进程和线程) 程序运行时在内存中分配自己独立的运行空间,就是进程 线程:它是位于进程中,负责当前进程中的某个具备独立运行资格的 ...
- JavaScript设计模式-----命令模式的简单应用
命令模式是最简单和优雅的模式之一,命令模式中的命令(command)是指一个执行某些特定事情的指令. 应用场景:有时候需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道被请求的操作是什么, ...
- jquery选择器 直观实验
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Alpha发布——美工+文案展示博客
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2283 文案: 学海无涯苦作舟,深海的远帆扬起成长的新程. 我将一滴水滴注 ...
- 阿帕奇web服务器下载部署安装运行
链接: https://jingyan.baidu.com/album/d8072ac47baf0eec95cefdca.html?picindex=4 1.apache服务安装成功可是启动失败“wi ...
- 0422 寻找数学口袋精灵BUG
首先要部署这个app项目就是第一步: 一.前提下载并安装JDK 在线图解:手把手教你安装JDK http://www.lvtao.net/server/windows-setup-jdk.h ...
- nexus在linux上搭建
Maven 仓库的分类:(maven的仓库只有两大类) 1.本地仓库 2.远程仓库,在远程仓库中又分成了3种: 2.1 中央仓库 2.2 私服 2.3 其它公共库 有个maven私服可以很方便地管理我 ...
- Mac下使用svn命令
Mac系统自带svn命令,能够很方便的同步更新代码,使用方法: 1.导入项目svn import /Users/username/Desktop/Project1 svn://192.168.1.12 ...