题目 :  链接 :https://loj.ac/problem/6285

题意:给出一个长为 n的数列,以及 n个操作,操作涉及询问区间的最小众数。

思路:虽然这不是一道 回滚莫队题,就是 暴力分块 的题, 但是 还是 可以用回滚莫队 写滴,好像大部分题解都是 暴力分块。

#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define dep(i,j,k) for(int i=k;i>=j;i--)
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,0,sizeof(i))
#define make(i,j) make_pair(i,j)
#define pb push_back
using namespace std;
const int N=1e5+;
int a[N],b[N],c[N],cnt[N],pos[N],n,block;
int tmp,ans[N],coun;
struct noq {
int l,r,id;
}q[N];
bool cmp(noq a,noq b) {
return pos[a.l]==pos[b.l]?a.r<b.r:pos[a.l]<pos[b.l];
}
int query(int l,int r) { ///暴力求答案
int t[N]; rep(i,l,r) t[b[i]]=; int w=,ww=;
rep(i,l,r) {
++t[b[i]];
if(t[b[i]]>=ww) {
if(t[b[i]]==ww && a[i]<w) w=a[i];
else if(t[b[i]]>ww) ww=t[b[i]],w=a[i];
}
}
return w;
}
void add(int x) {
++cnt[b[x]];
if(cnt[b[x]]>=coun) {
if(cnt[b[x]]==coun && a[x]<tmp) tmp=a[x];
else if(cnt[b[x]]>coun) coun=cnt[b[x]],tmp=a[x];
}
}
int slove(int qnum,int bnum) { ///处理 第 bnum 块, 现在 处理到 q[qnum] 这个查询
int i=qnum; int L=min(bnum*block,n); int l=L+,r=L; tmp=; coun=; ///L 即为块尾
rep(j,,n) cnt[j]=; ///初始化,每处理一个块 都要 搞一次的啦
for(;pos[q[i].l]==bnum;i++) {
if(pos[q[i].l]==pos[q[i].r]) {/// l,r 在同一块,暴力处理
ans[q[i].id]=query(q[i].l,q[i].r); continue;
}
while(r<q[i].r) add(++r); ///先移动 r 指针
int w=tmp,ww=coun; ///记录 l 指针 移动前的 tmp 和 coun 值
while(l>q[i].l) add(--l);
ans[q[i].id]=tmp; ///记录答案
tmp=w; coun=ww; ///还原 tmp 和 coun
while(l<L+) --cnt[b[l++]]; /// l 滚回块尾+1
}
return i; ///处理完这一块后,处理到第i个查询
}
int main() {
scanf("%d",&n);
block=sqrt(n);
rep(i,,n) {
scanf("%d",&a[i]); c[i]=a[i]; pos[i]=(i-)/block+;///一定要加1喔,因为slove的时候l,r初始化需要
}
int up=pos[n]; ///块数
sort(c+,c++n);
int newn=unique(c+,c++n)-(c+);
rep(i,,n) {
b[i]=lower_bound(c+,c++newn,a[i])-c;///数据太大,离散化a[i]
}
rep(i,,n) {
scanf("%d %d",&q[i].l,&q[i].r); q[i].id=i;
}
sort(q+,q++n,cmp);
int pp=; ///处理到的 q[i],pp即为i;
rep(i,,up) {
pp=slove(pp,i);
}
rep(i,,n) printf("%d\n",ans[i]);
return ;
}

loj#6285 数列分块入门 9 ( 回 滚 )的更多相关文章

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

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

  2. LOJ#6285. 数列分块入门 9

    有点难..... 要求区间众数,所以我可以先把区间分块,然后我预处理出从第 i 块到第 j 块的众数,用dp[i][j]记录下来. 因为需要知道众数的num值, 所以我可以用一个vector来保存每个 ...

  3. LOJ6277~6285 数列分块入门

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

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

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

  5. LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)

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

  6. LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)

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

  7. LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)

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

  8. LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

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

  9. LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))

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

随机推荐

  1. 初始STM32固件库

    1-汇编编写的启动文件 startup_stm32f10x_hd.s:设置堆栈指针.设置PC指针.初始化中断向量表.配置系统时钟.对用C库函数_main,最终去到C的世界 2-时钟配置文件 syste ...

  2. 移动构造函数应用最多的地方就是STL中(原文详解移动构造函数)

    移动构造函数应用最多的地方就是STL中 给出一个代码,大家自行验证使用move和不适用move的区别吧 #include <iostream> #include <cstring&g ...

  3. Idea 使用 Junit4 进行单元测试

    目录 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安装 2. 编写测试代码 3. 生成测试类 4. 运行 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安 ...

  4. Nomogram(诺莫图) | Logistic、Cox生存分析结果可视化

    本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/BWpy3F-nEKXCdVXmY3GYZg 当然还有更多R语言,生物信息学相关知识...

  5. Sql Server有主外键关系时添加、删除数据

    当表之间有主外键关系时删除数据会被约束,添加.删除失败 解决办法,我们可以先把主外键关系的检查约束给关掉 → 然后删除数据 → 之后再把约束打开 查询出关掉所有外键约束的语句 SELECT 'ALTE ...

  6. Ajax中解析Json的两种方法

    eval(); //此方法不推荐 JSON.parse(); //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: var jsonDate = '{ "name" ...

  7. MiniUI学习笔记一【转】

    MiniUI Api文档:http://miniui.com/docs/api/index.html 1.取组件值 传递form data,load发送 请求加载数据 <script type= ...

  8. 3、java基础:抽象类与接口的区别

    抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...

  9. Kafka 快速入门

    Kafka Kafka 核心概念 什么是 Kafka Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.该项目的目标是为处理实时数据提供一个统一.高吞吐.低延迟 ...

  10. less学习大纲总结

    1.注释的区别 /**/ //2.变量的命名 @+变量名 如:@f_width 引用的时候也要带上@ 符号3.混合 可带参数 默认带值4.匹配模式 相当于js里的if,但不完全是 用于符号条件的匹配 ...