LOJ #6285 分块入门9

时间:2022-08-31 22:21:51

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

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

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+7;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m;
vector<int >vec[maxn];
int gs(int x,int l,int r)
{
return upper_bound(vec[x].begin(),vec[x].end(),r)-lower_bound(vec[x].begin(),vec[x].end(),l);
}
int a[maxn],b[maxn],bl[maxn];
int f[2000][2000];
int s[maxn];
int get(int l,int r)
{
if(bl[l]==bl[r])
{
int ans=0,ans1=0;
for(int i=l;i<=r;i++)
{
int tmp=gs(a[i],l,r);
if(tmp>ans1){
ans=a[i];ans1=tmp;
}
if(tmp==ans1)ans=min(a[i],ans);
}
return ans;
}
int ans0=f[bl[l]+1][bl[r]-1],ans1=gs(ans0,l,r);
for(int i=l;bl[i]==bl[l];i++)
{
int tmp=gs(a[i],l,r);
if(tmp>ans1)
{
ans0=a[i];ans1=tmp;
}
if(tmp==ans1)ans0=min(a[i],ans0);
}
for(int i=r;bl[i]==bl[r];i--)
{
int tmp=gs(a[i],l,r);
if(tmp>ans1)ans0=a[i],ans1=tmp;
if(tmp==ans1)ans0=min(a[i],ans0);
}
return ans0;
}
int main()
{
n=read();
int d=(int)sqrt(n/2/log2(n));
for(int i=1;i<=n;i++)
{
a[i]=read();b[i]=a[i];bl[i]=(i-1)/d+1;
}
sort(b+1,b+1+n);
int ts=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+ts,a[i])-b;
for(int i=1;i<=n;i++) vec[a[i]].push_back(i);
for(int i=1;i<=bl[n];i++)
{
memset(s,0,sizeof(s));
int ans1=0,ans2=0;
for(int j=(i-1)*d+1;j<=n;j++)
{
s[a[j]]++;
if(s[a[j]]==ans2)
{
ans1=min(a[j],ans1);
}
else if(s[a[j]]>ans2)
{
ans1=a[j];ans2=s[a[j]];
}
if(bl[j+1]!=bl[j])
f[i][bl[j]]=ans1;
}
}
int p=0,q=0;
for(int i=1;i<=n;i++)
{
p=read();q=read();
if(p>q)swap(p,q);
cout<<b[get(p,q)]<<"\n";
}
}

  

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

  1. &lbrack;Loj&rsqb; 数列分块入门 1 - 9

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

  2. loj 数列分块入门 6 9&lpar;区间众数&rpar;

    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 &num;6285&period; 数列分块入门 9-分块&lpar;查询区间的最小众数&rpar;

    #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 &num;6284&period; 数列分块入门 8-分块&lpar;区间查询等于一个数c的元素,并将这个区间的所有元素改为c&rpar;

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

随机推荐

  1. tensorflow学习笔记四:mnist实例--用简单的神经网络来训练和测试

    刚开始学习tf时,我们从简单的地方开始.卷积神经网络(CNN)是由简单的神经网络(NN)发展而来的,因此,我们的第一个例子,就从神经网络开始. 神经网络没有卷积功能,只有简单的三层:输入层,隐藏层和输 ...

  2. JS 信息提示弹框封装

    // 功能提示弹框 function tipsBox ( option ) { var html = ''; if ( option.type == 'success' ) { html += '&l ...

  3. TCP的核心系列 — SACK和DSACK的实现(一)

    TCP的实现中,SACK和DSACK是比较重要的一部分. SACK和DSACK的处理部分由Ilpo Järvinen (ilpo.jarvinen@helsinki.fi) 维护. tcp_ack() ...

  4. java深拷贝和浅拷贝

    1.概念 java里的clone分为: A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍. Java中对 ...

  5. typeconfig&period;json配置说明

    如果一个目录下存在一个tsconfig.json文件,那么它意味着这个目录是TypeScript项目的根目录. 不带任何输入文件的情况下调用tsc,编译器会从当前目录开始去查找tsconfig.jso ...

  6. &period;net core 2&period;0 报错:error NU1102&colon; Unable to find package 。。。

    这种是nuget无法还原的问题.解决问题的方法: 在项目文件所在的目录下创建文件:NuGet.Config 里面内容: "?> <configuration> <pa ...

  7. session源码剖析

    session机制采用的是一种在客户端与服务端之间保持状态的解决方案,由于采用服务器端保持状态的方案在客户端也要保存标识,session机制也要借助于cookie机制达到目的.session保存了客户 ...

  8. 设计模式—桥接模式的C&plus;&plus;实现

    这是Bwar在2009年写的设计模式C++实现,代码均可编译可运行,一直存在自己的电脑里,曾经在团队技术分享中分享过,现搬到线上来. 1. 装饰模式简述 1.1 目的 将抽象部分与它的实现部分分离,使 ...

  9. img标签的onerror事件

    #情景分析: 有时,img标签中的src图片加载失败,原来的图片位置会出现一个碎片图标,这样让人很不爽,如何变得美观些呢? #解决方案: 可以借用img标签的onerror事件,img标签支持oner ...

  10. linux6&period;8安装docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...