[hdu5216]排序
题意:给定两个长度为M的数组a,b,对于一个1-M的排列,不妨设为P,如果对任意0<=i<M,都有a[i] <= b[P[i]],那么称为一种合法情况,对于一种合法情况,对所有0<=i<M,在n个长度为1的线段上的区间[a[i],b[p[i]]]涂上颜色,计X=没有涂颜色的最大连续长度,求x在所有合法情况中的期望。
思路:这个题想到了就是大水题了,可惜比赛的时候题目都没看。由于全排列P的存在,使得a数组可以对应b数组的任意一种“比较方式”,于是存在合法情况等价于存在一种b数组的全排列使得a[i]<=b[i]恒成立,由于全排列的任意性,不妨将a数组,b数组分别排序,如果对任意i,a[i]<=b[i]恒成立,那么合法情况存在。然后合法情况存在的基础上,考虑重新排列一下b数组,以得到其它的合法情况。在重排列过程中注意到,无论怎么重排,只要是合法情况,最后线段的涂色情况是一样的!于是对每一种合法情况,概率一样,X一样,所以期望等于任意一种合法情况的X。由于根据所有的i,把区间[a[i], b[i]]的线段涂上颜色,没涂颜色的连续段只可能出现在[b[i]+1,a[i+1]-1](至于为什么,画个图就清楚了,相当于左右边界分别递增的线段去覆盖),用这个去更新答案。
- #pragma comment(linker, "/STACK:102400000,102400000")
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstdlib>
- #include <cstring>
- #include <map>
- #include <queue>
- #include <deque>
- #include <cmath>
- #include <ctime>
- #include <cctype>
- #include <set>
- #include <bitset>
- #include <functional>
- #include <numeric>
- #include <stdexcept>
- #include <utility>
- #include <vector>
- using namespace std;
- #define mem0(a) memset(a, 0, sizeof(a))
- #define mem_1(a) memset(a, -1, sizeof(a))
- #define lson l, m, rt << 1
- #define rson m + 1, r, rt << 1 | 1
- #define define_m int m = (l + r) >> 1
- #define rep_up0(a, b) for (int a = 0; a < (b); a++)
- #define rep_up1(a, b) for (int a = 1; a <= (b); a++)
- #define rep_down0(a, b) for (int a = b - 1; a >= 0; a--)
- #define rep_down1(a, b) for (int a = b; a > 0; a--)
- #define all(a) (a).begin(), (a).end()
- #define lowbit(x) ((x) & (-(x)))
- #define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {}
- #define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {}
- #define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {}
- #define pchr(a) putchar(a)
- #define pstr(a) printf("%s", a)
- #define sstr(a) scanf("%s", a)
- #define sint(a) scanf("%d", &a)
- #define sint2(a, b) scanf("%d%d", &a, &b)
- #define sint3(a, b, c) scanf("%d%d%d", &a, &b, &c)
- #define pint(a) printf("%d\n", a)
- #define test_print1(a) cout << "var1 = " << a << endl
- #define test_print2(a, b) cout << "var1 = " << a << ", var2 = " << b << endl
- #define test_print3(a, b, c) cout << "var1 = " << a << ", var2 = " << b << ", var3 = " << c << endl
- typedef long long LL;
- typedef pair<int, int> pii;
- typedef vector<int> vi;
- const int dx[] = {, , -, , , , -, -};
- const int dy[] = {-, , , , , -, , - };
- const int maxn = 1e5 + ;
- const int md = ;
- const int inf = 1e9 + ;
- const LL inf_L = 1e18 + ;
- const double pi = acos(-1.0);
- const double eps = 1e-;
- template<class T>T gcd(T a, T b){return b==?a:gcd(b,a%b);}
- template<class T>bool max_update(T &a,const T &b){if(b>a){a = b; return true;}return false;}
- template<class T>bool min_update(T &a,const T &b){if(b<a){a = b; return true;}return false;}
- template<class T>T condition(bool f, T a, T b){return f?a:b;}
- template<class T>void copy_arr(T a[], T b[], int n){rep_up0(i,n)a[i]=b[i];}
- int make_id(int x, int y, int n) { return x * n + y; }
- int a[], b[];
- int main() {
- //freopen("in.txt", "r", stdin);
- int T, n, m;
- cin >> T;
- while (T --) {
- cin >> n >> m;
- rep_up0(i, m) {
- sint(a[i]);
- }
- rep_up0(i, m) {
- sint(b[i]);
- }
- sort(a, a + m);
- sort(b, b + m);
- bool ok = true;
- rep_up0(i, m) {
- if (a[i] > b[i]) {
- ok = false;
- break;
- }
- }
- if (!ok) {
- puts("Stupid BrotherK!");
- continue;
- }
- int ans = a[] - ;
- rep_up0(i, m - ) {
- max_update(ans, a[i + ] - b[i] - );
- }
- max_update(ans, n - b[m - ]);
- printf("%d.000000\n", ans);
- }
- return ;
- }
[hdu5216]排序的更多相关文章
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- iOS可视化动态绘制八种排序过程
前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中
#coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...
- javascript排序
利用array中的sort()排序 w3cfunction sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = " ...
- iOS自定义model排序
在开发过程中,可能需要按照model的某种属性排序. 1.自定义model @interface Person : NSObject @property (nonatomic,copy) NSStri ...
随机推荐
- 2.hover的使用
1. 自身的hover div :hover{ :hover前要有空格 } 2.hover指向子元素 father:hover .childer { :hover前不能有空格 } 3.ho ...
- Java IO 流 -- 随机读取和写入流 RandomAccessFile (文件分割和合并)
RandomAccessFile 相对其它流多了一个seek() 方法指定指针的偏移量. 1.指定起始位置读取剩余内容 public static void test01() throws IOExc ...
- linux下文件的打包和压缩
文章来源:linux下文件的打包和压缩 目录 一.文件压缩的原理 二.linux常见的压缩指令 三.常用实例 1.tar命令 2.zip命令 3.gz命令 4.bz2命令 5.xz命令(必须分两步) ...
- thinkphp5和nginx不得不说的故事
由于之前学习用的都是apsche,所以对ngnix一窍不通,在这里写给正在学习的同行,希望可以帮助到你们: 如果你不会用apache部署tp5的可以查看我之前发布的文章,里面有提到 phpstudy ...
- UML由浅入深
在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...
- urlencode()和rawurlencode()区别
urlencode和rawurlencode两个方法在处理字母数字,特殊符号,中文的时候结果都是一样的 ,唯一的不同是对空格的处理, urlencode处理成“+”, rawurlencod ...
- Linux系统管理第一二三四章 系统管理 目录和文件管理 安装及管理程序 账号管理
命令 功能 序号 第一章 cd 切换目录 1 stat 查看文件状态信息 2 cp 复制 -f -i -p -r 3 du 统计磁盘的大小 4 find 精细查找文件和目录 5 help 帮助 ...
- js中的this指针的用法
首先看下面代码: function funcA() { this.name = "hello"; console.log(this.name); this.show = funct ...
- Facebook发布神经蛋分离法,可从嘈杂环境中提取音视频
分离混合分布是机器学习和信号处理的长期挑战,而Facebook近日提出的新方法似乎可以有效解决这一难题. 人类天生善于分离个别声音和视觉效果,例如在拥挤的鸡尾酒会上听到别人的声音,或者在动物穿过灌木丛 ...
- flutter中使用redux之多界面互动
在上一篇文章,我们介绍了如何在flutter中使用redux.在上一篇文章的例子中,我们使用了单界面集成redux,但是在实际项目中,我们通常涉及多个模块,每个模块涉及多个界面,那么如何使用redux ...