题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911

解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少是多少?

因为每次相邻的交换操作最多只能减少一个逆序对,所以最多可以减少k个逆序对,所以我们只要求出原来的序列有多少个逆序对然后减去k再跟0取较大的就可以了。

因为数据范围是10的五次方,所以暴力求肯定会TLE,所以要用n*logn算法求逆序对,n*logn算法有几种可以求逆序对的:

线段树,树状数组,归并排序。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef __int64 INT;
 7 const int maxn = 100000+5;
 8
 9 struct node
10 {
11     int d,cixu;
12 }A[maxn];
13 struct Node
14 {
15     int l,r;
16     INT n;
17 }tree[4*maxn];
18 bool cmp1(node a,node b)
19 {
20     if(a.d == b.d) return a.cixu < b.cixu;
21     return a.d < b.d;
22 }
23 bool cmp2(node a,node b)
24 {
25     return a.cixu < b.cixu;
26 }
27 void build(int p)
28 {
29     if(tree[p].l == tree[p].r) return ;
30     int mid = (tree[p].l + tree[p].r) / 2;
31     tree[2*p].l = tree[p].l;
32     tree[2*p].r = mid;
33     tree[2*p].n = tree[2*p+1].n = 0;
34     tree[2*p+1].l = mid + 1;
35     tree[2*p+1].r = tree[p].r;
36     build(2*p);
37     build(2*p+1);
38 }
39 void insert(int p,int l)
40 {
41     tree[p].n++;
42     if(tree[p].l == tree[p].r) return ;
43     int mid = (tree[p].l + tree[p].r) / 2;
44     if(l <= mid) insert(2*p,l);
45     else insert(2*p+1,l);
46 }
47 INT query(int p,int l,int r)
48 {
49     if(l > r) return 0;
50     if(tree[p].l == l && tree[p].r == r)
51     return tree[p].n;
52     int mid = (tree[p].l + tree[p].r) / 2;
53     if(r <= mid) query(2*p,l,r);
54     else if(l <= mid && r > mid)
55     return query(2*p,l,mid) + query(2*p+1,mid+1,r);
56     else return query(2*p+1,l,r);
57 }
58
59 int main()
60 {
61     int n;
62     INT k;
63     while(scanf("%d%I64d",&n,&k)!=EOF)
64     {
65         tree[1].l = 1;
66         tree[1].r = n;
67         tree[1].n = 0;
68         build(1);
69         for(int i = 1;i <= n;++i)
70         {
71             scanf("%d",&A[i].d);
72             A[i].cixu = i;
73         }
74         sort(A+1,A+n+1,cmp1);
75         int f = 0,hehe = 0x7fffffff;
76         for(int i = 1;i <= n;++i)
77         {
78             if(A[i].d != hehe)
79             {
80                 hehe = A[i].d;
81                 f++;
82             }
83             A[i].d = f;
84         }
85         sort(A+1,A+n+1,cmp2);
86         INT ans = 0;
87         for(int i = 1;i <= n;++i)
88         {
89             ans += query(1,A[i].d+1,n);
90             insert(1,A[i].d);
91         }
92         ans = ans-k > 0? (ans-k) : 0;
93         printf("%I64d\n",ans);
94     }
95     return 0;
96 }

View Code

转载于:https://www.cnblogs.com/xiaxiaosheng/p/3894670.html

HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)相关推荐

  1. hdu 4911 求逆序对数+树状数组

    http://acm.hdu.edu.cn/showproblem.php?pid=4911 给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 实际上每交换一次能且只能 ...

  2. HDU 6681 Rikka with Cake(扫描线、动态开点线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6681 题意 在矩形区域内有k条射线,问这些射线将矩形分成了多少区域 题解 容易发现答案为所有射线交点个数+1. ...

  3. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  4. 【HDU - 4056】Draw a Mess (并查集 or 线段树)

    题干: It's graduated season, every students should leave something on the wall, so....they draw a lot ...

  5. 【HDU - 4217 】Data Structure? (线段树求第k小数)

    题干: Data structure is one of the basic skills for Computer Science students, which is a particular w ...

  6. 不可摸数http://acm.hdu.edu.cn/showproblem.php?pid=1999

    不可摸数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. hdu 2461(线段树求面积并)

    题意:给出N个矩形,M次询问 每次询问给出R个,问这R个矩形围成的面积 解题思路:对于每次询问,做一次线段树求面积的并操作. 每个节点保存的信息有l,r,cover,len分别表示该节点表示的区间[l ...

  8. hdu 1255(线段树求重叠面积)

    扫描线求矩形重叠面积:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html http://www.tuicool.co ...

  9. HDU 3308 线段树求区间最长连续上升子序列长度

    题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值 #include <bits/stdc++.h> #define N 100005 us ...

最新文章

  1. 微信协议简单调研笔记
  2. 一款轻量级的桌面WebServer通讯组件
  3. 关于硕士研究生的几点思考
  4. JRE System Library和 Referenced Libraries 的区别和来源
  5. 线上lnmp环境快速安装
  6. mvp内粗泄露问题_如何在一小时内启动MVP服务器
  7. 鸡啄米vc++2010系列7(对话框:创建对话框类和添加控件变量)
  8. mysql having函数
  9. 《图解TCPIP》知识学习(1.3):协议
  10. 常见的相机输出接口CVBS、VGA、DVI、HDMI、SDI、Camera Link、HS-LINK、CoaXPress
  11. VUE全局this指向
  12. 【机器学习】——逻辑模型:树模型(决策树)
  13. 魔兽世界az端和TC端有什么区别 Mangos,TC,SW,AZ,AC的关系
  14. NAT 模式下网关设置
  15. 唯一约束判断 细微差mysql别_50道MySQL面试题,查漏补缺看你掌握多少?(附答案解析)...
  16. 【RO】Robust formulation controls higher moments
  17. 嵌入式端音频开发(Unisound篇)之 7.2 蜂鸟开发环境搭建
  18. 云服务器读不出U盘,云服务器不识别u盘
  19. mysql判断日期是不是月末_java 判断一个日期是不是月末
  20. 迪杰斯特拉算法-(.c)

热门文章

  1. 11-17网页基础--表单
  2. (Mirage系列之四)Mirage经典案例之集中桌面管理
  3. 在一切都是虚的世界里,你能做的是什么?
  4. Hibernate dbcp连接池使用方法
  5. 一步一步学VBScript(4)之WSH对象三
  6. [Java] 蓝桥杯ALGO-42 算法训练 送分啦
  7. [Java] 蓝桥杯ALGO-115 算法训练 和为T
  8. 蓝桥杯 ALGO-148 算法训练 5-1最小公倍数
  9. [Python] L1-034. 点赞 团体程序设计天梯赛GPLT
  10. 蓝桥杯 ALGO-90 算法训练 出现次数最多的整数