二分答案+++++++(。・ω・。) 感觉这个思路好像挺常用的:求第\(K\) 大 --> 二分第 \(K\) 大的值 --> 检验当前二分的值排名是第几。前提:排名与数值大小成单调性变化。于是对于这题我们也不例外,二分一下最后中位数的值是多少,把数组中的值 \(> K\) 的变成 \(1\),\(< K\) 的变成 \(-1\), \(= K\) 的为 \(0\)。那么,一个中位数为 \(K\) 的区间区间和为 \(0\), 一个中位数\(< K\) 的区间和 \(< 0\), \(> K\) 则 \(> 0\)。

  于是求区间中位数 \(> K\) 和 \(=K\) 的区间就转化为了求满足条件的区间值的区间。这个只需要用树状数组维护一下就好啦。由于有奇数的规定,我们开两个树状数组分别代表偶数下标和奇数下标,以保证求得的区间长度为奇数。以及因为有负数,所以将数组整体向后平移即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 350000
  4. #define INF INT_MAX
  5. #define lowbit(i) (i & (-i))
  6. int n, K, ans, a[maxn], A[maxn], sum[maxn];
  7. int C[][maxn], b[maxn], D = 1e5;
  8.  
  9. int read()
  10. {
  11. int x = , k = ;
  12. char c; c = getchar();
  13. while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
  14. while(c >= '' && c <= '') x = x * + c - '', c = getchar();
  15. return x * k;
  16. }
  17.  
  18. void Update(int x, int opt)
  19. {
  20. for(int i = x; i < maxn; i += lowbit(i))
  21. C[opt][i] += ;
  22. }
  23.  
  24. int Query(int x, int opt)
  25. {
  26. int ret = ;
  27. for(int i = x; i; i -= lowbit(i))
  28. ret += C[opt][i];
  29. return ret;
  30. }
  31.  
  32. int Check(int mid)
  33. {
  34. memset(C, , sizeof(C));
  35. int ans1 = , ans2 = ; Update(D, );
  36. for(int i = ; i <= n; i ++)
  37. {
  38. if(a[i] < mid) A[i] = -;
  39. else if(a[i] > mid) A[i] = ;
  40. else A[i] = ;
  41. sum[i] = sum[i - ] + A[i];
  42. Update(sum[i] + D, i % );
  43. ans1 += Query(sum[i] + D, (i % ) ^ ) - Query(sum[i] + D - , (i % ) ^ );
  44. ans2 += Query(sum[i] + D - , (i % ) ^ );
  45. }
  46. if(K > ans1 + ans2) return ;
  47. else if(K < ans2) return ;
  48. else return ;
  49. }
  50.  
  51. int main()
  52. {
  53. n = read(), K = read();
  54. for(int i = ; i <= n; i ++) a[i] = b[i] = read();
  55. sort(b + , b + + n);
  56. int l = , r = n;
  57. while(l <= r)
  58. {
  59. int mid = (l + r) >> ;
  60. int k = Check(b[mid]);
  61. if(k == ) r = mid - ;
  62. else if(k == ) l = mid + ;
  63. else { ans = b[mid]; break; }
  64. }
  65. printf("%d\n", ans);
  66. return ;
  67. }

【题解】51nod 1685第K大区间2的更多相关文章

  1. ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  2. 51nod 1685 第K大区间2

    定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值[1]:3[2]:1[ ...

  3. 51nod 1686 第K大区间2

    1685 第K大区间2 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数(统计学/数学名词)_百度百科 Input 第一行两个数n和k(1<=n ...

  4. 51nod 1686 第k大区间

    1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...

  5. 51NOD 1686 第K大区间 二分

    第k大区间   定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input   第一行两个数n和k(1<=n<=100000,k<=n* ...

  6. 【题解】51nod 1686第K大区间

    成功的秘诀,在于克服自己看题解的冲动……[笑哭].自己A掉这题还是灰常开心的~ 以及爱死 two - pointer ! two - pointer 大法是真的好哇……这个题目有上一题的经验:求第\( ...

  7. 51 NOD 1685 第K大区间2 二分+BIT

    题目描述: 定义一个长度为奇数的区间的值为其所包含的的元素的中位数. 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值 [1]:3 [2]:1 ...

  8. 51nod 1686 第K大区间 二分瞎搞

    题目: 定义一个区间的值为其众数出现的次数. 现给出n个数,求将所有区间的值排序后,第K大的值为多少. 题解: 答案明显单调,我们考虑二分答案. 转化为判定问题后我们需要观察到一个性质: 如果一个区间 ...

  9. 51nod 1686 第K大区间【离散化+二分】

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意: 定义一个区间的值为其众数出现的次数. 现给出n ...

随机推荐

  1. 相机-imu外参校准总结

    1. 研究背景及相关工作 1)研究背景 单目视觉惯性slam是一种旨在跟踪移动平台的增量运动并使用来自单个车载摄像头和imu传感器的测量结果同时构建周围环境地图的技术.视觉相机和惯性测量单元(imu) ...

  2. Tomcat - 远程调试配置

    复制一份startup.bat,更名为“startup-debug”. 替换内容如下: call "%EXECUTABLE%" start %CMD_LINE_ARGS% 替换为 ...

  3. android学习七 菜单

    1.菜单分类 常规菜单 子菜单 上下文菜单 图标菜单 辅助菜单 交替菜单 2.菜单类 andriod.view.menu   3.菜单的参数     名称:字符串标题     菜单ID:整数     ...

  4. create-react-app react-redux项目 配置模块热更新hmr

    HRM并不是create-react-app专属的,提供一篇博客介绍hrm http://chrisshepherd.me/posts/adding-hot-module-reloading-to-c ...

  5. python3 小实践(一)——selenium获取的cookie传递

    from selenium import webdriver from time import sleep import requests import pickle #获取登录后的cookies c ...

  6. lesson 20 pioneer pilots

    lesson 20 Pioneer pilots driver pilot rider cyclist 骑自行车的人 介词后不加that cover + 距离 = travel 了一段距离 by su ...

  7. 【cookie接口】- jmeter - (请求提示no cookie)

    1.虽然 请求成功 响应码 200  ,但是  返回code 1  ,表示接口不成功 2.加入 空的cookie 管理器就可以了  返回 code 0 注意:状态码 200 只是表示请求是成功的 , ...

  8. mysql数据库常用操作

    目前最流行的数据库: oracle.mysql.sqlserver.db2.sqline --:单行注释 #:也是单行注释 /* 注释内容*/:多行注释 mysql -uroot -p密码:登录mys ...

  9. 清橙 A1318 加强版:Almost

    题意: 直接看题面吧 原版:\(n \leq 1e5, q \leq 3e4, TL 5s, ML 256G\) 加强版1:\(n,q \leq 1.5e5, TL 5s, ML 256G\) 加强版 ...

  10. LeetCode 95——不同的二叉搜索树 II

    1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...