POJ训练计划2299_Ultra-QuickSort(线段树/单点更新)
2024-09-08 02:57:24
解题报告
题意:
求逆序数。
思路:
线段树离散化处理。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define LL long long
using namespace std;
LL sum[2001000],num[501000],_hash[501000];
void push_up(int rt)
{
sum[rt]=sum[rt*2]+sum[rt*2+1];
}
void update(int rt,int l,int r,int p,LL v)
{
if(l==r)
{
sum[rt]=+v;
return;
}
int mid=(l+r)/2;
if(p<=mid)update(rt*2,l,mid,p,v);
else update(rt*2+1,mid+1,r,p,v);
push_up(rt);
}
LL q_sum(int rt,int l,int r,int ql,int qr)
{
if(ql>r||qr<l)return 0;
if(ql<=l&&r<=qr)return sum[rt];
int mid=(l+r)/2;
return q_sum(rt*2,l,mid,ql,qr)+q_sum(rt*2+1,mid+1,r,ql,qr);
}
int main()
{
int n,i,j;
while(~scanf("%d",&n))
{
LL ans=0;
if(!n)break;
memset(_hash,0,sizeof(_hash));
memset(num,0,sizeof(num));
memset(sum,0,sizeof(sum));
for(i=0; i<n; i++)
{
scanf("%LLd",&num[i]);
_hash[i]=num[i];
}
sort(_hash,_hash+n);
int m=unique(_hash,_hash+n)-_hash;
for(i=0; i<n; i++)
{
int t=lower_bound(_hash,_hash+m,num[i])-_hash+1;
ans+=q_sum(1,1,m,t+1,m);
update(1,1,m,t,1);
}
printf("%lld\n",ans);
}
return 0;
}
Ultra-QuickSort
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 41278 | Accepted: 14952 |
Description
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is
sorted in ascending order. For the input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
sorted in ascending order. For the input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence
element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
Output
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
Sample Input
5
9
1
0
5
4
3
1
2
3
0
Sample Output
6
0
Source
最新文章
- #研发解决方案介绍#Tracing(鹰眼)
- Http请求中Content-Type讲解以及在Spring MVC中的应用
- 一款符合当前主流审美的Swing外观(Look and Feel)_测试版发布
- javascript 命令方式 测试例子
- android studio无法关联源码
- 草珊瑚的css基础
- UIScrollView控件详解
- 再探Delphi2010 Class的构造和析构顺序
- html5的116个标签
- 深入浅出AQS之条件队列
- 最全的命令行(gradle)打包安卓apk
- Java集合框架的四个接口
- arcgis api 3.x for js 共享干货系列之一自写算法实现地图量算工具(附源码下载)
- NLP文本相似度
- Django 创建超级用户
- Java多线程学习笔记之一线程基础
- 3种启动tornado的方式
- UVA-10127 Ones (数论)
- 轨至轨运算放大器 rail to rail
- Android Performance 性能提升
热门文章
- nodejs实现网站数据的爬取
- Redis那些事(一) — Redis简介
- POI导出,开发中经常会遇到数据导出这样的问题,下面是我在开发中采用的解决方法,大家可以参考,具体的实现害的结合你自身的业务逻辑
- Linux test命令
- ubuntu卸载编译安装的软件
- 【URAL 1989】 Subpalindromes(线段树维护哈希)
- There is no getter for property named &#39;id&#39; in class &#39;java.lang.String&#39;
- 东软Unieap平台
- 【RMAN】RMAN跨版本恢复(下)--大版本异机恢复
- windows 2008、2012防火墙添加入站规则教程(端口例外)