p4168 [Violet]蒲公英(分块)
区间众数的重题
和数列分块入门9双倍经验还是挺好的
然后开O2水过
好像有不带log的写法啊
之后在补就是咕咕咕
// luogu-judger-enable-o2
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <cmath>
using namespace std;
int m,belong[100100],f[1000][1000],sz,blocknum,n,val[100100],id=0,cnt[100100],a[100100],ans=0;
vector<int> Vec[100100];
map<int,int> To;
void calbe(int n){
    for(int i=1;i<=n;i++)
        belong[i]=(i-1)/sz+1;
}
void pre(int x){
    memset(cnt,0,sizeof(cnt));
    int ans=0,ansto=0;
    for(int i=(x-1)*sz+1;i<=n;i++){
        cnt[a[i]]++;
        if(cnt[a[i]]>ansto||(val[a[i]]<=val[ans]&&cnt[a[i]]>=ansto))
            ans=a[i],ansto=cnt[a[i]];
        f[x][belong[i]]=ans;
    }
}
int query(int l,int r,int c){
    return upper_bound(Vec[c].begin(),Vec[c].end(),r)-lower_bound(Vec[c].begin(),Vec[c].end(),l);
}
int query(int l,int r){
    int lsx=belong[l];
    int rex=belong[r];
    int ans=0,ansto=0,mid;
    for(int i=l;i<=min(lsx*sz,r);i++)
        if((mid=query(l,r,a[i]))>ansto||(val[a[i]]<=val[ans]&&mid>=ansto))
            ans=a[i],ansto=mid;
    if(lsx!=rex){
        for(int i=(rex-1)*sz+1;i<=r;i++)
            if((mid=query(l,r,a[i]))>ansto||(val[a[i]]<=val[ans]&&mid>=ansto))
                ans=a[i],ansto=mid;
        if(lsx+1<=rex-1)
            if((mid=query(l,r,f[lsx+1][rex-1]))>ansto||(val[f[lsx+1][rex-1]]<=val[ans]&&mid>=ansto))
                ans=f[lsx+1][rex-1],ansto=mid;
    }
    return ans;
}
int main(){
    // freopen("1.in","r",stdin);
    // freopen("test.out","w",stdout);
    scanf("%d %d",&n,&m);
    sz=150;
    blocknum=n/sz;
    if(n%sz)
        blocknum++;
    calbe(n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(!To[a[i]]){
            To[a[i]]=++id;
            val[id]=a[i];
        }
        a[i]=To[a[i]];
        Vec[a[i]].push_back(i);
    }
    for(int i=1;i<=blocknum;i++)
        pre(i);
    for(int i=1;i<=m;i++){
        int l,r;
        scanf("%d %d",&l,&r);
        l=(l+ans-1)%n+1;
        r=(r+ans-1)%n+1;
        if(r<l)
            swap(l,r);
        printf("%d\n",ans=val[query(l,r)]);
    }
    return 0;
}
p4168 [Violet]蒲公英(分块)的更多相关文章
- Luogu P4168 [Violet]蒲公英 分块
		这道题算是好好写了.写了三种方法. 有一个好像是$qwq$$N\sqrt(N)$的方法,,但是恳请大佬们帮我看看为什么这么慢$qwq$(后面的第三种) 注:$pos[i]$表示$i$属于第$pos[i ... 
- 洛谷 P4168 [Violet]蒲公英 解题报告
		P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ... 
- [Violet]蒲公英   分块
		发现写算法专题老是写不动,,,, 所以就先把我在luogu上的题解搬过来吧! 题目大意:查询区间众数,无修改,强制在线 乍一看是一道恐怖的题,仔细一看发现并没有那么难: 大致思路是这样的,首先我们要充 ... 
- P4168 [Violet]蒲公英  区间众数
		$ \color{#0066ff}{ 题目描述 }$ 在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关. 为了简化起见,我们把所有的蒲公英看成一个长度为n的序列 \((a_1,a_2.. ... 
- P4168 [Violet]蒲公英
		神仙分块题?其实还是很简单的,res[i][j]表示第i块到第j块的众数,然后再用sum[i][j]表示前i块中j这个种类出现的次数,然后分块瞎搞就行了,感觉我写的十分简洁,好评( //author ... 
- [洛谷P4168][Violet]蒲公英
		题目大意:有$n(n\leqslant4\times10^4)$个数,$m(m\leqslant5\times10^4)$个询问,每次问区间$[l,r]$内的众数,若相同输出最小的,强制在线. 题解: ... 
- luogu P4168 [Violet]蒲公英
		嘟嘟嘟 分块经典题竟然是一道黑题…… 分块求区间众数的大体思想是对于询问区间[L, R],预处理出这中间的整块的众数,然后统计两边零散的数在[L, R]中出现的次数,最后取出现次数最多且最小的数. 因 ... 
- 洛谷 P4168 [Violet] 蒲公英
		历尽千辛万苦终于AC了这道题目... 我们考虑1个区间\([l,r]\), 被其完整包含的块的区间为\([L,R]\) 那么众数的来源? 1.\([l,L)\)或\((R,r]\)中出现的数字 2.\ ... 
- BZOJ2724 [Violet]蒲公英   分块
		题目描述 经典区间众数题目 然而是权限题,所以题目链接放Luogu的 题解 因为太菜所以只会$O(n*\sqrt{n}+n*\sqrt{n}*log(n))$的做法 就是那种要用二分的,并不会clj那 ... 
随机推荐
- Azure Messaging-ServiceBus Messaging消息队列技术系列1-基本概念和架构
			前段时间研究了Window Azure ServiceBus Messaging消息队列技术,搞了很多技术研究和代码验证,最近准备总结一下,分享给大家. 首先,Windows Azure提供了两种类型 ... 
- 20165215 2017-2018-2《Java程序设计》第一周学习总结
			20165215 2017-2018-2 <Java程序设计>第一周学习总结 教材学习内容总结 跟随网课学习了<Java2 实用教程>的第一章,进行了基础的编译练习 在Ubun ... 
- MongoDB3.X单机及shading cluster集群的权限管理(基于3.4.5)
			mongodb集群的权限管理分为两部分,一部分是最常用的Role-Based Access Control,也就是用户名密码方式,这种验证方式一般出现在单机系统,或者集群中client端连接Mongo ... 
- Linux基础命令---管理组gpasswd
			gpasswd gpasswd指令用来管理组文件“/etc/group”和“/etc/gshadow”,每个组可以设置管理员.组员.密码.系统管理员可以使用-A选项定义组管理员,使用-M选项定义成员. ... 
- CAT Caterpillar ET is really a exceptional obd2 solution
			As a excellent obd2 solutions,Heavy Duty Diagnostic CAT Caterpillar ET Diagnostic Adapter features a ... 
- 实例,C# 导出.dbf格式文件
			using System; using System.Collections using System.Configuration; using System.Data; using System. ... 
- 同行span标签设置display:inline-block;overflow:hidden垂直对齐问题
			1 问题描述:一个div包含 三个span 当span2 类样式设置如下图时,将导致垂直方向不对齐的情况 2解决方案: 将前面的也设置同样的样式 overflow:hidden; display:in ... 
- Python进阶【第六篇】内置函数中好玩的几个(今天写的太水)
			zip()函数 两个参数一一对应,参数是序列类型,序列包括列表,元组,字符串,当两个序列不等长时,按公共最长部分匹配,形似“拉链”. max()和min()函数 以max()为例,min()类似,只是 ... 
- centos7 static for django2.1
			#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ... 
- sqlalchemy学习笔记
			https://segmentfault.com/a/1190000006949536 
