题意:区间众数,不带修改,带修改刚看了一眼没看懂cls在讲啥QAQ。

题解:按照代码中那个sqrt(n/2/log2(n))大小分块,可以用均值不等式证明的,就是假设查询和n同级,然后一通爆算就可以得出了。然后预处理出(i,j)块之间最多的数。然后不满一块的部分在vector上二分,这题要先离散化。PS:loj上可以看别人代码学习速度++ 啊。因为把hzwer的1-9看了一遍,时间有限,就随便挑一个了,然后bzoj上的题是权限题,就注册了loj找了份简洁的学着写了,不太习惯,然后有更优秀的做法,看hzwer博客以及cls的论文吧,如果这样预处理直接sqrt(n)是TLE的,应该是卡掉了。

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int maxn=1e5+7;
  5. inline ll read()
  6. {
  7. ll x=0,f=1;char ch=getchar();
  8. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  9. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  10. return x*f;
  11. }
  12. int n,m;
  13. vector<int >vec[maxn];
  14. int gs(int x,int l,int r)
  15. {
  16. return upper_bound(vec[x].begin(),vec[x].end(),r)-lower_bound(vec[x].begin(),vec[x].end(),l);
  17. }
  18. int a[maxn],b[maxn],bl[maxn];
  19. int f[2000][2000];
  20. int s[maxn];
  21. int get(int l,int r)
  22. {
  23. if(bl[l]==bl[r])
  24. {
  25. int ans=0,ans1=0;
  26. for(int i=l;i<=r;i++)
  27. {
  28. int tmp=gs(a[i],l,r);
  29. if(tmp>ans1){
  30. ans=a[i];ans1=tmp;
  31. }
  32. if(tmp==ans1)ans=min(a[i],ans);
  33. }
  34. return ans;
  35. }
  36. int ans0=f[bl[l]+1][bl[r]-1],ans1=gs(ans0,l,r);
  37. for(int i=l;bl[i]==bl[l];i++)
  38. {
  39. int tmp=gs(a[i],l,r);
  40. if(tmp>ans1)
  41. {
  42. ans0=a[i];ans1=tmp;
  43. }
  44. if(tmp==ans1)ans0=min(a[i],ans0);
  45. }
  46. for(int i=r;bl[i]==bl[r];i--)
  47. {
  48. int tmp=gs(a[i],l,r);
  49. if(tmp>ans1)ans0=a[i],ans1=tmp;
  50. if(tmp==ans1)ans0=min(a[i],ans0);
  51. }
  52. return ans0;
  53. }
  54. int main()
  55. {
  56. n=read();
  57. int d=(int)sqrt(n/2/log2(n));
  58. for(int i=1;i<=n;i++)
  59. {
  60. a[i]=read();b[i]=a[i];bl[i]=(i-1)/d+1;
  61. }
  62. sort(b+1,b+1+n);
  63. int ts=unique(b+1,b+1+n)-b-1;
  64. for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+ts,a[i])-b;
  65. for(int i=1;i<=n;i++) vec[a[i]].push_back(i);
  66. for(int i=1;i<=bl[n];i++)
  67. {
  68. memset(s,0,sizeof(s));
  69. int ans1=0,ans2=0;
  70. for(int j=(i-1)*d+1;j<=n;j++)
  71. {
  72. s[a[j]]++;
  73. if(s[a[j]]==ans2)
  74. {
  75. ans1=min(a[j],ans1);
  76. }
  77. else if(s[a[j]]>ans2)
  78. {
  79. ans1=a[j];ans2=s[a[j]];
  80. }
  81. if(bl[j+1]!=bl[j])
  82. f[i][bl[j]]=ans1;
  83. }
  84. }
  85. int p=0,q=0;
  86. for(int i=1;i<=n;i++)
  87. {
  88. p=read();q=read();
  89. if(p>q)swap(p,q);
  90. cout<<b[get(p,q)]<<"\n";
  91. }
  92. }

  

LOJ #6285 分块入门9的更多相关文章

  1. [Loj] 数列分块入门 1 - 9

    数列分块入门 1 https://loj.ac/problem/6277 区间加 + 单点查询 #include <iostream> #include <cstdio> #i ...

  2. loj 数列分块入门 6 9(区间众数)

    6 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及单点插入,单点询问,数据随机生成. 题解 参考:http://hzwer.com/8053.html 每个块内用一个\(vecto ...

  3. loj 数列分块入门 5 7 8

    5 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间开方,区间求和. 思路 用\(tag\)记录这一块是否已全为\(1\). 除分块外,还可用 树状数组+并查集(链表) 或者 线 ...

  4. LOJ 数列分块入门系列

    目录 1.区间加+单点查 每个块维护tag,散的暴力改. code: #include<bits/stdc++.h> using namespace std; const int maxn ...

  5. LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)

    #6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给 ...

  6. LOJ6277~6285 数列分块入门

    Portals 分块需注意的问题 数组大小应为,因为最后一个块可能会超出的范围. 当操作的区间在一个块内时,要特判成暴力修改. 要清楚什么时候应该+tag[t] 数列分块入门 1 给出一个长为的数列, ...

  7. 数列分块入门九题(三):LOJ6283~6285

    Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...

  8. LOJ 6277:数列分块入门 1(分块入门)

    #6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 3 测试数据 题目描述 给出一 ...

  9. LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)

    #6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

随机推荐

  1. 【原】Java学习笔记018 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 继承关系的子类可以 ...

  2. LeetCode算法题-Next Greater Element I(Java实现)

    这是悦乐书的第244次更新,第257篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第111题(顺位题号是496).你有两个数组(没有重复)nums1和nums2,其中nu ...

  3. git、github、gitlab之间的关系

    GIt-版本控制工具:GitHub-一个网站平台,提供给用户空间存储git仓储,保存用户的一些数据文档或者代码等:GitLab - 基于Git的项目管理软件. Git分布式版本控制系统 Git是一款自 ...

  4. python开发【lambda篇】

    lambda 与 python 高级函数的配套使用 filter函数 过滤 __author__ = "Tang" # filter(lambda, []) people = [' ...

  5. Autofs自动挂载探讨

    Autofs介绍: mount是用来挂载文件系统的,可以在系统启动的时候挂载也可以在系统启动后挂载.对于本地固定设 备,如硬盘可以使用mount挂载:而光盘.软盘.NFS.SMB等文件系统具有动态性, ...

  6. Java注解开发与应用案例

    Java注解开发与应用案例 Annotation(注解)是JDK5.0及以后版本引入的,可以对包.类.属性.方法的描述,给被述对象打上标签,被打上标签后的类.属性.方法将被赋予特殊的“功能”:打个比喻 ...

  7. consul 搭建

    windows 1. 下载consul https://www.consul.io/downloads.html 2. 解压至consul_1.4.2 3.配置环境变量 path下新增D:\work\ ...

  8. SQL NULL 值

    NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS NOT NULL 操作符. SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不 ...

  9. UVALive - 3211 - Now or later(图论——2-SAT)

    Problem   UVALive - 3211 - Now or later Time Limit: 9000 mSec Problem Description Input Output Sampl ...

  10. MAX

    Max的用法1(Min类似) Matlab中max函数在矩阵中求函数大小的实例如下: C = max(A)返回一个数组各不同维中的最大元素.如果A是一个向量,max(A)返回A中的最大元素.如果A是一 ...