loj#6285 数列分块入门 9 ( 回 滚 )
题目 : 链接 :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 ( 回 滚 )的更多相关文章
- LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给 ...
- LOJ#6285. 数列分块入门 9
有点难..... 要求区间众数,所以我可以先把区间分块,然后我预处理出从第 i 块到第 j 块的众数,用dp[i][j]记录下来. 因为需要知道众数的num值, 所以我可以用一个vector来保存每个 ...
- LOJ6277~6285 数列分块入门
Portals 分块需注意的问题 数组大小应为,因为最后一个块可能会超出的范围. 当操作的区间在一个块内时,要特判成暴力修改. 要清楚什么时候应该+tag[t] 数列分块入门 1 给出一个长为的数列, ...
- LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)
#6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)
#6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)
#6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1 题目描述 给出 ...
- LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)
#6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5 题目描述 给出 ...
- LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)
#6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 题目描述 给出一个 ...
- LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))
#6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给 ...
随机推荐
- prometheus+grafana监控nginx
被监控机器环境搭建&配置 nginx-module-vts下载: https://github.com/vozlt/nginx-module-vts nginx-module-vts安装 un ...
- BZOJ4516 SDOI2016生成魔咒(后缀自动机)
本质不同子串数量等于所有点的len-parent树上父亲的len的和.可以直接维护. #include<iostream> #include<cstdio> #include& ...
- BZOJ4556 HEOI2016/TJOI2016字符串 (后缀树+主席树)
二分答案后相当于判断一个区间的后缀与某个后缀的最长公共前缀是否能>=ans.建出后缀树,在上述问题中后者所在节点向上倍增的跳至len>=ans的最高点,然后相当于查询子树中是否有该区间的节 ...
- php底层变量存储
变量存储 php的变量使用一个结构体 zval来保存的,在Zend/zend.h中我们可以看到zval的定义 struct _zval_struct { /* Variable information ...
- 在CentOS部署AspNetCore网站
前段时间某云服务器大促,就买了一台打算折腾一下,买了几个月,却啥也没做,就改了个初始密码.最近快到双十一了,另一家厂商相同配置的服务器价格又便宜了一大截,看来又得剁手了.从今年开始,搜索一下云服务器, ...
- 菜鸡之NetCore 使用EF操作数据库 Oracle & Sqlserver (一)
摘要: 该篇文章主要记录netCore EFCore 如何操作Oracle和SqlServer 数据库,采用Codefirst方式创建数据库以及表. 一, 项目建立 项目采用DDD领域驱动设计模式[学 ...
- buffer 与 cache 的区别
Buffer 和 Cache buffer 和 cache 同样作为缓存,他们之间有什么区别呢? 简单来说,buffer 是即将要写入磁盘的缓存,而 cache 是从磁盘中读出来放到缓存的 参考来自: ...
- 多态——virtual
作用:解决当使用基类的指针指向派生类的对象并调用派生类中与基类同名的成员函数时会出错(只能访问到基类中的同名的成员函数)的问题,从而实现运行过程的多态 不加virtual #include<io ...
- 一、eureka服务端自动配置
所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 @EnableEurekaServer开关 eureka是一个c/s架构的服务治理框架, ...
- bootstrap 模态框在iphone微信内点击无效
<a data-toggle="modal" data-target="#wwww" href="" οnclick=" ...