HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)
题目链接: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(线段树求逆序对)相关推荐
- hdu 4911 求逆序对数+树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=4911 给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 实际上每交换一次能且只能 ...
- HDU 6681 Rikka with Cake(扫描线、动态开点线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=6681 题意 在矩形区域内有k条射线,问这些射线将矩形分成了多少区域 题解 容易发现答案为所有射线交点个数+1. ...
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- 【HDU - 4056】Draw a Mess (并查集 or 线段树)
题干: It's graduated season, every students should leave something on the wall, so....they draw a lot ...
- 【HDU - 4217 】Data Structure? (线段树求第k小数)
题干: Data structure is one of the basic skills for Computer Science students, which is a particular w ...
- 不可摸数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 ...
- hdu 2461(线段树求面积并)
题意:给出N个矩形,M次询问 每次询问给出R个,问这R个矩形围成的面积 解题思路:对于每次询问,做一次线段树求面积的并操作. 每个节点保存的信息有l,r,cover,len分别表示该节点表示的区间[l ...
- hdu 1255(线段树求重叠面积)
扫描线求矩形重叠面积:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html http://www.tuicool.co ...
- HDU 3308 线段树求区间最长连续上升子序列长度
题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值 #include <bits/stdc++.h> #define N 100005 us ...
最新文章
- 微信协议简单调研笔记
- 一款轻量级的桌面WebServer通讯组件
- 关于硕士研究生的几点思考
- JRE System Library和 Referenced Libraries 的区别和来源
- 线上lnmp环境快速安装
- mvp内粗泄露问题_如何在一小时内启动MVP服务器
- 鸡啄米vc++2010系列7(对话框:创建对话框类和添加控件变量)
- mysql having函数
- 《图解TCPIP》知识学习(1.3):协议
- 常见的相机输出接口CVBS、VGA、DVI、HDMI、SDI、Camera Link、HS-LINK、CoaXPress
- VUE全局this指向
- 【机器学习】——逻辑模型:树模型(决策树)
- 魔兽世界az端和TC端有什么区别 Mangos,TC,SW,AZ,AC的关系
- NAT 模式下网关设置
- 唯一约束判断 细微差mysql别_50道MySQL面试题,查漏补缺看你掌握多少?(附答案解析)...
- 【RO】Robust formulation controls higher moments
- 嵌入式端音频开发(Unisound篇)之 7.2 蜂鸟开发环境搭建
- 云服务器读不出U盘,云服务器不识别u盘
- mysql判断日期是不是月末_java 判断一个日期是不是月末
- 迪杰斯特拉算法-(.c)
热门文章
- 11-17网页基础--表单
- (Mirage系列之四)Mirage经典案例之集中桌面管理
- 在一切都是虚的世界里,你能做的是什么?
- Hibernate dbcp连接池使用方法
- 一步一步学VBScript(4)之WSH对象三
- [Java] 蓝桥杯ALGO-42 算法训练 送分啦
- [Java] 蓝桥杯ALGO-115 算法训练 和为T
- 蓝桥杯 ALGO-148 算法训练 5-1最小公倍数
- [Python] L1-034. 点赞 团体程序设计天梯赛GPLT
- 蓝桥杯 ALGO-90 算法训练 出现次数最多的整数