SGU 180 Inversions(离散化 + 线段树求逆序对)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180
解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组。因为这题中的数列有重复的而且范围特别大,所以要进行离散化,离散化的方法是,
首先按照输入的数字排个序,然后把整个数列扫一遍,得出每个数字离散化的结果,然后再按照输入的顺序把顺序调整回来就OK 了。线段树部分就不说了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef __int64 INT;
const int maxn = +; struct node
{
int data,cixu,dd;
}que[maxn]; struct Node
{
INT data;
int l,r;
}tree[*maxn]; bool cmp1(node a,node b)
{
return a.data <= b.data;
}
bool cmp2(node a,node b)
{
return a.cixu < b.cixu;
}
void maketree(int p)
{
if(tree[p].l == tree[p].r)
return ;
int mid = (tree[p].l + tree[p].r) / ;
tree[*p].data = ;
tree[*p].l = tree[p].l;
tree[*p].r = mid;
maketree(*p);
tree[*p+].data = ;
tree[*p+].l = mid + ;
tree[*p+].r = tree[p].r;
maketree(*p+);
}
INT find(int p,int l,int r)
{
if(l > r)
return ;
if(tree[p].l == l && tree[p].r == r)
return tree[p].data;
int mid = (tree[p].l + tree[p].r) / ;
if(r <= mid)
return find(*p,l,r);
else if(l <= mid && r > mid)
return find(*p,l,mid) + find(*p+,mid + ,r);
else return find(*p+,l,r);
}
void push(int p,int d)
{
tree[p].data++;
if(tree[p].l == tree[p].r)
return ;
int mid = (tree[p].l + tree[p].r) / ;
if(d <= mid)
push(*p,d);
else push(*p+,d);
}
int main()
{
int n;
scanf("%d",&n);
for(int i = ;i <= n;++i)
{
scanf("%d",&que[i].data);
que[i].cixu = i;
}
sort(que+,que+n+,cmp1);
int f = -;
que[].data = 0x7fffffff; //只要一个跟所有输入的数都不同的就行了
for(int i = ;i <= n;++i)
{
if(que[i].data != que[i-].data)
f++;
que[i].dd = f;
}
tree[].data = ;
tree[].l = ;
tree[].r = f;
maketree();
sort(que+,que+n+,cmp2);
INT tot = ;
for(int i = ;i <= n;++i)
{
tot += find(,que[i].dd + ,f);
push(,que[i].dd);
}
printf("%I64d\n",tot);
return ;
}
SGU 180 Inversions(离散化 + 线段树求逆序对)的更多相关文章
- 4163 hzwer与逆序对 (codevs + 权值线段树 + 求逆序对)
题目链接:http://codevs.cn/problem/4163/ 题目:
- BNU 2418 Ultra-QuickSort (线段树求逆序对)
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=2418 解题报告:就是给你n个数,然后让你求这个数列的逆序对是多少?题目中n的范围是n & ...
- HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...
- hdu1394(线段树求逆序对)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 线段树功能:update:单点增减 query:区间求和 分析:如果是0到n-1的排列,那么如果 ...
- poj2299 Ultra-QuickSort(线段树求逆序对)
Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...
- hdu 6318 Swaps and Inversions (线段树求逆序对数)
Swaps and Inversions Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- FZU2018级算法第五次作业 m_sort(归并排序或线段树求逆序对)
首先对某人在未经冰少允许情况下登录冰少账号原模原样复制其代码并且直接提交的赤裸裸剽窃行为,并且最终被评为优秀作业提出抗议! 题目大意: 给一个数组含n个数(1<=n<=5e5),求使用冒泡 ...
- HDU 1394 线段树求逆序对
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- POJ 2188线段树求逆序对
题目给的输入是大坑,算法倒是很简单-- 输入的是绳子的编号wire ID,而不是上(或下)挂钩对应下(或上)挂钩的编号. 所以要转换编号,转换成挂钩的顺序,然后再求逆序数. 知道了这个以后直接乱搞就可 ...
随机推荐
- gulp初体验记录(简介、插件开发介绍)
目前用的业界比较知名的三个前端构建工具:grunt.gulp.fis,自己此前一直都是只在用grunt,fis看过一点,gulp则一直都没注意过,直到最近发现好像用的人越来越多,所以今天也就抽了点时间 ...
- Google浏览器导出书签
C:\users\用戶名\AppData\Local\Google\Chrome\User Data\Default\Bookmarks 這個文件就是書簽啊,復制一下就行了
- LINQ找出重复和不重复的元素及linq OrderBy 方法 两个字段同时排序有关问题
//重复元素:3,4,5 //不重复元素:1,8,9 , , , , , , , , , , }; //不重复元素 var unique = arr.GroupBy(i => i) .Where ...
- 多个相同name的文本输入框,输入其中一个后,使剩下的不能输入值
可以用blur或keyup事件响应: 实现一: <body> <input type="text" id="AfterOtOt1" name= ...
- 小记:Quartz 当 Job 执行时间超过触发间隔时间时所发生的情况
一个普通的 Job 实现如下: public class Job1 : IJob { public void Execute(IJobExecutionContext context) { Conso ...
- SQL注入备忘单
Find and exploit SQL Injections with free Netsparker SQL Injection Scanner SQL Injection Cheat Sheet ...
- FZU2082树链剖分
简单题. #include<queue> #include<stack> #include<cmath> #include<cstdio> #inclu ...
- hdu3374 KMP+最大最小表示法
这题要求的是字符串左移时字典序最小和最大的第几次出现,并求出现次数.考虑一会可以发现,出现次数和循环节是有关系的. 出现了几次,就是循环了几次,如果循环节是他本身,也就是无循环,那这个字符串不管怎么移 ...
- maven中Rhino classes (js.jar) not found - Javascript disabled的处理
想使用单元测试 来测一下服务请求,于是想到了使用Junit,查了一下,决定使用 HttpUnit 来发送请求 于是在maven中引入了 <dependency> <groupId&g ...
- sql-函数avg,count,max,min,sum
常用函数 AVG (平均) COUNT (计数) MAX (最大值) MIN (最小值) SUM (总合) 运用函数的语法是: SELECT "函数名"("栏位名&qu ...