模板题,提供两种思路。

1.考虑它求得是 出现个数\(>\lfloor \frac{r-l+1}{k}\rfloor\) 的最小值

那么我们可以根据如果大于这个数那么你把这个区间数列排好序然后分段,分成 \(k\) 段,每次上下整都取,方便处理.webp

因为 \(k\leq5\) 所以上下整都取不会超过 \(10\) 个数字,依次查询,取个 \(\min\) ,没了。

2.考虑主席树本身的性质,他就是个权值线段树,直接放进来查询就完事了,左边的权值一定比右边的权值小,如果左边的出现个数大于 \(\lfloor \frac{r-l+1}{k} \rfloor\) 那么很显然这边是有可能的,暴力找下试试看,如果不行的话,向右找,如果可以的话,这样依次找,直到找到了,一定是最小值,如果变成最大值的话,就从右边开始取

  1. // powered by c++11
  2. // by Isaunoya
  3. #include<bits/stdc++.h>
  4. #define rep(i , x , y) for(register int i = (x) ; i <= (y) ; ++ i)
  5. #define Rep(i , x , y) for(register int i = (x) ; i >= (y) ; -- i)
  6. using namespace std ;
  7. using db = double ;
  8. using ll = long long ;
  9. using uint = unsigned int ;
  10. #define int long long
  11. using pii = pair < int , int > ;
  12. #define ve vector
  13. #define Tp template
  14. #define all(v) v.begin() , v.end()
  15. #define sz(v) ((int)v.size())
  16. #define pb emplace_back
  17. #define fir first
  18. #define sec second
  19. // the cmin && cmax
  20. Tp < class T > void cmax(T & x , const T & y) { if(x < y) x = y ; }
  21. Tp < class T > void cmin(T & x , const T & y) { if(x > y) x = y ; }
  22. // sort , unique , reverse
  23. Tp < class T > void sort(ve < T > & v) { sort(all(v)) ; }
  24. Tp < class T > void unique(ve < T > & v) { sort(all(v)) ; v.erase(unique(all(v)) , v.end()) ; }
  25. Tp < class T > void reverse(ve < T > & v) { reverse(all(v)) ; }
  26. const int SZ = 0x191981 ;
  27. struct FILEIN {
  28. ~ FILEIN () {} char qwq[SZ] , * S = qwq , * T = qwq , ch ;
  29. char GETC() { return (S == T) && (T = (S = qwq) + fread(qwq , 1 , SZ , stdin) , S == T) ? EOF : * S ++ ; }
  30. FILEIN & operator >> (char & c) { while(isspace(c = GETC())) ; return * this ; }
  31. FILEIN & operator >> (string & s) {
  32. while(isspace(ch = GETC())) ; s = ch ;
  33. while(! isspace(ch = GETC())) s += ch ; return * this ;
  34. }
  35. Tp < class T > void read(T & x) {
  36. bool sign = 1 ; while((ch = GETC()) < 0x30) if(ch == 0x2d) sign = 0 ;
  37. x = (ch ^ 0x30) ; while((ch = GETC()) > 0x2f) x = x * 0xa + (ch ^ 0x30) ;
  38. x = sign ? x : -x ;
  39. }
  40. FILEIN & operator >> (int & x) { return read(x) , * this ; }
  41. FILEIN & operator >> (signed & x) { return read(x) , * this ; }
  42. FILEIN & operator >> (unsigned & x) { return read(x) , * this ; }
  43. } in ;
  44. struct FILEOUT { const static int LIMIT = 0x114514 ;
  45. char quq[SZ] , ST[0x114] ; signed sz , O ;
  46. ~ FILEOUT () { sz = O = 0 ; }
  47. void flush() { fwrite(quq , 1 , O , stdout) ; fflush(stdout) ; O = 0 ; }
  48. FILEOUT & operator << (char c) { return quq[O ++] = c , * this ; }
  49. FILEOUT & operator << (string str) {
  50. if(O > LIMIT) flush() ; for(char c : str) quq[O ++] = c ; return * this ;
  51. }
  52. Tp < class T > void write(T x) {
  53. if(O > LIMIT) flush() ; if(x < 0) { quq[O ++] = 0x2d ; x = -x ; }
  54. do { ST[++ sz] = x % 0xa ^ 0x30 ; x /= 0xa ; } while(x) ;
  55. while(sz) quq[O ++] = ST[sz --] ; return ;
  56. }
  57. FILEOUT & operator << (int x) { return write(x) , * this ; }
  58. FILEOUT & operator << (signed x) { return write(x) , * this ; }
  59. FILEOUT & operator << (unsigned x) { return write(x) , * this ; }
  60. } out ;
  61. int n , q ;
  62. const int maxn = 3e5 + 10 ;
  63. int a[maxn] , rt[maxn] ;
  64. int ls[maxn << 5] , rs[maxn << 5] , val[maxn << 5] ;
  65. int cnt = 0 ;
  66. void upd(int & p , int pre , int l , int r , int x) {
  67. p = ++ cnt ;
  68. val[p] = val[pre] + 1 ;
  69. ls[p] = ls[pre] , rs[p] = rs[pre] ;
  70. if(l == r) return ;
  71. int mid = l + r >> 1 ;
  72. if(x <= mid)
  73. upd(ls[p] , ls[pre] , l , mid , x) ;
  74. else
  75. upd(rs[p] , rs[pre] , mid + 1 , r , x) ;
  76. }
  77. //int kth(int a , int b , int l , int r , int k) {
  78. // if(l == r) return l ;
  79. // int x = val[ls[b]] - val[ls[a]] ;
  80. // if(x <= k)
  81. // return kth(ls[a] , ls[b] , l , mid , k) ;
  82. // else
  83. // return kth(rs[a] , rs[b] , mid + 1 , r , k - x) ;
  84. //}
  85. //int count(int a , int b , int l , int r , int x) {
  86. // if(l == r)
  87. // return val[b] - val[a] ;
  88. // int mid = l + r >> 1 ;
  89. // if(x <= mid)
  90. // return count(ls[a] , ls[b] , l , mid , x) ;
  91. // else
  92. // return count(rs[a] , rs[b] , mid + 1 , r , x) ;
  93. //}
  94. int qry(int a , int b , int l , int r , int k) {
  95. if(l == r) return l ;
  96. int x = val[ls[b]] - val[ls[a]] ;
  97. int y = val[rs[b]] - val[rs[a]] ;
  98. int mid = l + r >> 1 , ans = -1 ;
  99. if(x > k) {
  100. ans = qry(ls[a] , ls[b] , l , mid , k) ;
  101. }
  102. if(~ ans) return ans ;
  103. if(y > k) {
  104. ans = qry(rs[a] , rs[b] , mid + 1 , r , k) ;
  105. }
  106. return ans ;
  107. }
  108. signed main() {
  109. #ifdef _WIN64
  110. freopen("testdata.in" , "r" , stdin) ;
  111. #else
  112. ios_base :: sync_with_stdio(false) ;
  113. cin.tie(nullptr) , cout.tie(nullptr) ;
  114. #endif
  115. // code begin.
  116. in >> n >> q ;
  117. rep(i , 1 , n) {
  118. in >> a[i] ;
  119. }
  120. rep(i , 1 , n) {
  121. upd(rt[i] , rt[i - 1] , 1 , n , a[i]) ;
  122. }
  123. while(q --) {
  124. int l , r , k ;
  125. in >> l >> r >> k ;
  126. k = (r - l + 1) / k ;
  127. out << qry(rt[-- l] , rt[r] , 1 , n , k) << '\n' ;
  128. }
  129. return out.flush() , 0 ;
  130. // code end.
  131. }

CF840D[Destiny] [主席树板子]的更多相关文章

  1. 主席树板子 p2104

    #include<cstdio> #include<algorithm> #include<vector> using namespace std; ; int n ...

  2. #194 sequence(搜索+动态规划+主席树)

    考虑按顺序暴搜子序列.如果序列中的数两两不同,显然每次给上一个找到的子序列添上后缀最小值,即为下一个要找的子序列.如果不能再加了就回溯继续考虑后缀次小.第三小……值,直到找到k个子序列. 有重复的数后 ...

  3. BZOJ2821 作诗(Poetize) 主席树 bitset

    原文链接https://www.lydsy.com/JudgeOnline/problem.php?id=2821 题目传送门 - BZOJ2821 题意 $n$ 个数,$m$ 组询问,每次问 $[l ...

  4. 洛谷P2633 Count on a tree 主席树

    传送门:主席树 解题报告: 传送门! umm这题我还麻油开始做 所以 先瞎扯一波我的想法,如果错了我就当反面教材解释这种典型错误,对了我就不管了QwQ 就直接dfs,在dfs的过程中建树 然后就直接查 ...

  5. 洛谷P3567 KUR-Couriers [POI2014] 主席树/莫队

    正解:主席树/莫队 解题报告: 传送门! 这题好像就是个主席树板子题的样子,,,? 毕竟,主席树的最基本的功能就是,维护一段区间内某个数字的个数 但是毕竟是刚get到主席树,然后之前做的一直是第k大, ...

  6. 洛谷P3248 树 [HNOI2016] 主席树+倍增+分治

    正解:主席树+倍增+分治 解题报告: 传送门! 首先看到这题会想到之前考过的这题 但是那题其实简单一些,,,因为那题只要用个分治+预处理就好,只是有点儿思维难度而已 这题就不一样,因为它说了是按照原树 ...

  7. P3302 [SDOI2013]森林(主席树+启发式合并)

    P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...

  8. BZOJ 2733 [HNOI2012]永无乡 - 启发式合并主席树

    Description 1: 查询一个集合内的K大值 2: 合并两个集合 Solution 启发式合并主席树板子 Code #include<cstdio> #include<cst ...

  9. 区间内x的出现个数(主席树)

    题目大概:求区间内x出现的次数 出题人yjy Description ZJK 给你一个长度为 n 的数列和 m 次询问,每次询问从第 l 个到第 r 个数中,数 x 出现了多少次.Input第一行一个 ...

随机推荐

  1. 《Python学习手册 第五版》 -第1章 问答环节

    第一章的主要内容是解疑答惑的,这个部分也是很适合初学者的,回答了大部分初学者所关注的问题 1.为什么使用Python,或者说Python的优点, 作者是分为两个部分来谈的,人们使用中的经验总结以及Py ...

  2. JAVA编程思想——分析阅读

    需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...

  3. ELK:日志收集分析平台

    简介 ELK是一个日志收集分析的平台,它能收集海量的日志,并将其根据字段切割.一来方便供开发查看日志,定位问题:二来可以根据日志进行统计分析,通过其强大的呈现能力,挖掘数据的潜在价值,分析重要指标的趋 ...

  4. Leetcode题解 - 部分中等难度算法题解(56、957、825、781、1324、816)

    957. N 天后的牢房 思路: 模拟变换,当N天结合后返回 => 当N非常大的时候,超时 => 一般N很大的时候,这种题目必然存在循环,所以记录找过的状态,一旦出现已经访问过的状态可立即 ...

  5. gRPC in ASP.NET Core 3.x - gRPC 简介

    gRPC的结构 在我们搭建gRPC通信系统之前,首先需要知道gRPC的结构组成. 首先,需要一个server(服务器),它用来接收和处理请求,然后返回响应. 既然有server,那么肯定有client ...

  6. 使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)

    为大家介绍下Python爬虫库BeautifulSoup遍历文档树并对标签进行操作的详细方法与函数下面就是使用Python爬虫库BeautifulSoup对文档树进行遍历并对标签进行操作的实例,都是最 ...

  7. C# 8.0 新特性之二:接口默认实现

    ​      在C#8.0中,针对接口引入了一项新特性,就是可以指定默认实现,方便对已有实现进行扩展,也对面向Android和Swift的Api进行互操作提供了可能性.下面我们来看看该特性的的概念.规 ...

  8. .Net core webapi使用httpClient发送异步请求遇到TaskCanceledException: A task was canceled

    前言:本人最近较多使用.net core的项目,最近在使用httpClient发送请求的时候,遇到服务器处理时间较长时,就老是会报异常:TaskCanceledException: A task wa ...

  9. Myeclipse maven项目转web项目

    右键点击项目,选择project facets,或者在properties选择,点“Convert to faceted from...” 勾选java和Dynamic Web Module 选项 接 ...

  10. P5727 【深基5.例3】冰雹猜想

    链接:Miku -------------------- 欸,为什么我第一遍没过 -------------------- #include<iostream> using namespa ...