loj#6285 数列分块入门 9 ( 回 滚 )

news/2024/8/26 17:06:17

题目 :  链接 :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+111;
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]]=0; int w=0,ww=0;
    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+1,r=L; tmp=0; coun=0; ///L 即为块尾
    rep(j,1,n) cnt[j]=0; ///初始化,每处理一个块 都要 搞一次的啦
    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+1) --cnt[b[l++]]; /// l 滚回块尾+1
    }
    return i; ///处理完这一块后,处理到第i个查询
}
int main() {
    scanf("%d",&n);
    block=sqrt(n);
    rep(i,1,n) {
        scanf("%d",&a[i]); c[i]=a[i]; pos[i]=(i-1)/block+1;///一定要加1喔,因为slove的时候l,r初始化需要
    }
    int up=pos[n]; ///块数
    sort(c+1,c+1+n);
    int newn=unique(c+1,c+1+n)-(c+1);
    rep(i,1,n) {
        b[i]=lower_bound(c+1,c+1+newn,a[i])-c;///数据太大,离散化a[i]
    }
    rep(i,1,n) {
        scanf("%d %d",&q[i].l,&q[i].r); q[i].id=i;
    }
    sort(q+1,q+1+n,cmp);
    int pp=1; ///处理到的 q[i],pp即为i;
    rep(i,1,up) {
        pp=slove(pp,i);
    }
    rep(i,1,n) printf("%d\n",ans[i]);
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Willems/p/10891635.html


http://www.niftyadmin.cn/n/3682142.html

相关文章

使用Java实现一个缓存

啥也不说&#xff0c;直接上代码&#xff0c;欢迎指正。 package com.example.demo.cache;/*** className: JdkCache* description: TODO 类描述* author: Yang.H* date: 2021/8/2014:26**/import lombok.extern.slf4j.Slf4j;import java.util.Date; import java.util.Map; im…

【Java基础】之集合

集合 集合继承图 Collection 继承图 常用方法 1. add:添加元素 2. remove:删除指定元素&#xff0c;或指定下标。重载&#xff1b; 3. contains&#xff1a;查找指定元素是否存在 4. size&#xff1a;获取元素的个数 5. isEmpty:判断集合是否为空&#xff1b; 6. clear&…

洛谷P1147连续自然数和

采用前缀和思想&#xff0c;用二分查找寻找区间&#xff0c;时间复杂度O(nnlogn) #include<bits/stdc.h> #define maxn 2000000 using namespace std; long long arr[maxn1]; long long brr[maxn1]; int main() {brr[0]0;for(int i1;i<maxn;i){arr[i]i;brr[i]brr[i-1]…

ASP.NET:使用web.config文件进行配置

web.config配置文件中所有的配置设置都应该位于 <configuration> <system.web> 和 </system.web> </configuration> 之间. web.config的设置对于整个应用程序起作用&#xff0c;同时程序中随时可以调用web.config中的节点设置及关键key的值。web.c…

python开发学习

Python开发学习 一、Linux基础 Linux安装&#xff0c;Linux基本命令&#xff0c;Linux文件系统&#xff0c;Linux权限管理&#xff0c;Linux用户管理&#xff0c;Linux编辑器vim&#xff0c;shell脚本&#xff0c;Linux防火墙&#xff0c;Linux-LNMP架构原理搭建。 二、Python基…

Global.asax文件中触发那些事件

Application对象创建和结束时所触发的事件有    Application_Start    Application_End   Session对象创建和结束时所触发的事件有    Session_Start    Session_End   对程序有请求发生时触发的事件有 (按发生顺序排列)    Application_BeginRequest    Appli…

【JVM】之类加载子系统

Java & JVM Java是跨平台的语言&#xff0c;JVM是跨语言的平台。 Java【write once&#xff0c;run anywhere】一次编译到处运行。由于Java经过前端编译器[Javac]生成的是字节码class文件&#xff0c;而这个class文件在不同平台的虚拟机都是可以运行的&#xff0c;这也就…

数据集 (ADO.NET)

数据集 (ADO.NET)DataSet 对象对于支持 ADO.NET 中的断开连接的分布式数据方案起到至关重要的作用。 DataSet 是数据驻留在内存中的表示形式&#xff0c;不管数据源是什么&#xff0c;它都可提供一致的关系编程模型。它可以用于多种不同的数据源&#xff0c;用于 XML 数据&…