题解:分块+离散化

解题报告:

一个分块典型题呢qwq还是挺妙的毕竟是道黑题

然,然后发现忘记放链接了先放链接QAQ

有两三种解法,都港下qwq

第一个是O(n5/3)的复杂度,谢总说不够优秀没有港,等下看了再写qwq

umm看了下大概明白了似乎qwq

虽然不知道我看的是不是这个解法×

就是法二不是有个f[][]表示区间内众数是谁嘛

然后法一中除了开这个以外还开了color[][][]表示区间内每个数的出现次数

这样就不用二分了!

但是这样的话就很容易T?是要吸氧的qwq

代码就懒得放了(主要懒得打了,,,这个题目的细节太多了,,,QAQ

第二个是O(n√nlogn)的,这个港下

就先分块,处理每个块里面的众数

然后对于每个询问,答案有两种可能

第一种,是中间被完全包含的块的众数

第二种,是两边出现过的数

然后再开个vector相当于桶排一样存下每个值所有出现的位置,每次lowerbound暴力查找第二种(两边的直接强行暴力枚举就好

第一种的话可以先暴力预处理出f[i][j]表示第i块到第j块的众数,这样每次就可以直接查了qwq)

然后就可以了,正确性我感觉还挺显然的就不证明辣?

其实我都懒得打这个代码了,,,本来感觉想通了思路之后大概不太复杂?但总有人问我做了没有,,,就很烦,,,于是就做了下

然后发现细节挺多挺麻烦:D

于是就耗了一天总算打出来了

布星啊现在状态越来越差了随便丢我个题都要调好久好久好久的,效率极低QAQ

对了这题给了我个小惊喜欸,,,就是,我才知道我的离散化一直有一点儿问题...就是我unique的那个tot,应该还要-=1我一直没有这么做,但玄学的是一直好像也没问题,,,ummm,,,很迷,,,幸好NOIp中我没有用离散化啥的不然怕是直接GG了?QAQ

然后放个代码就走了,就是记得把第三个方法学下趴qwq

#include<bits/stdc++.h>
using namespace std;
#define rp(i,x,y) for(register int i=x;i<=y;++i)
#define my(i,x,y) for(register int i=y;i>=x;--i)

+,sqtN=+;
int n,m,cjk,len,a[N],b[N],st[N],num[N],mx[sqtN][sqtN];
vector<int>gg[N];

inline int read()
{
    ;;
    '))ch=getchar();
    ;
    )+(x<<)+(ch^'),ch=getchar();
    return y?x:-x;
}
int cal(int x,int l,int r)
{
    );
    int L,R,ret1,ret2;
    L=,R=gg[x].size()-,ret1=R;
    while(L<=R)
    {
        ;
        ;
        ;
    }
    L=,R=gg[x].size()-,ret2=L;
    while(L<=R)
    {
        ;
        ;
        ;
    }
    ,);
}

int main()
{
//    freopen("cjk.in","r",stdin);
//    freopen("cjk.out","w",stdout);
    n=read();m=read();len=;cjk=(n-)/len+;
    rp(i,,n)st[i]=a[i]=read();
    sort(st+,st++n);,st++n)-st-;
    rp(i,,n)a[i]=lower_bound(st+,st++tot,a[i])-st;
    rp(i,,n)gg[a[i]].push_back(i);
    rp(i,,n)b[i]=(i-)/len+;
    rp(i,,cjk)
    {
        memset(num,,sizeof(num));
        ;
        rp(j,i,cjk)
        {
            rp(k,(j-)*len+,min(n,j*len))
            {
                num[a[k]]++;
                if(num[a[k]]>num[x] || (num[a[k]]==num[x] && x>a[k]))x=a[k];
            }
            mx[i][j]=x;
        }
    }
    ;
    while(m--)
    {
        )%n+,r=(read()+ans-)%n+,mxans=,x=;if(l>r)swap(l,r);
        )
            rp(i,l,r)
            {
                int d=cal(a[i],l,r);
                if(d>mxans || (d==mxans && x>a[i]))mxans=d,x=a[i];
            }
        else
        {
            x=mx[b[l]+][b[r]-];mxans=cal(x,l,r);//二分和max都打挂了?哭了QAQ
            );++i)
            {
                int d=cal(a[i],l,r);
                if(d>mxans || (d==mxans && x>a[i]))mxans=d,x=a[i];
            }
             && (i==r || i%len!=);--i)
            {
                int d=cal(a[i],l,r);
                if(d>mxans|| (d==mxans && x>a[i]))mxans=d,x=a[i];
            }
        }
        printf("%d\n",ans=st[x]);
    }
    ;
}

第三个是听说有个O(n√n)的?然后我不会:D先把解法二写了再来学这个qwq

洛谷P4168 蒲公英 [Violet] 分块的更多相关文章

  1. 洛谷P4168 蒲公英 分块处理区间众数模板

    题面. 许久以前我还不怎么去机房的时候,一位大佬好像一直在做这道题,他称这道题目为"大分块". 其实这道题目的思想不只可以用于处理区间众数,还可以处理很多区间数值相关问题. 让我们 ...

  2. 【洛谷 P4168】[Violet]蒲公英(分块)

    题目链接 题目大意:给定\(n\)个数和\(m\)个求区间众数的询问,强制在线 这题我\(debug\)了整整一个下午啊..-_- 从14:30~16:45终于\(debug\)出来了,\(debug ...

  3. 洛谷P4198 楼房重建 (分块)

    洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题, ...

  4. 洛谷P4135 作诗 (分块)

    洛谷P4135 作诗 题目描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章 ...

  5. 洛谷P3247 [HNOI2016]最小公倍数 [分块,并查集]

    洛谷 思路 显然,为了达到这个最小公倍数,只能走\(a,b\)不是很大的边. 即,当前询问的是\(A,B\),那么我们只能走\(a\leq A,b\leq B\)的边. 然而,为了达到这最小公倍数,又 ...

  6. 「分块系列」「洛谷P4168 [Violet]」蒲公英 解题报告

    蒲公英 Description 我们把所有的蒲公英看成一个长度为\(n\)的序列(\(a_1,a_2,...a_n\)),其中\(a_i\)为一个正整数,表示第i棵蒲公英的种类的编号. 每次询问一个区 ...

  7. 洛谷 P4168 [Violet]蒲公英 解题报告

    P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ...

  8. [洛谷P4168][Violet]蒲公英

    题目大意:有$n(n\leqslant4\times10^4)$个数,$m(m\leqslant5\times10^4)$个询问,每次问区间$[l,r]$内的众数,若相同输出最小的,强制在线. 题解: ...

  9. 洛谷 P4168 [Violet] 蒲公英

    历尽千辛万苦终于AC了这道题目... 我们考虑1个区间\([l,r]\), 被其完整包含的块的区间为\([L,R]\) 那么众数的来源? 1.\([l,L)\)或\((R,r]\)中出现的数字 2.\ ...

随机推荐

  1. RF-字符串转为整数的方法

  2. oracle数据据 Python+Pandas 获取Oracle数据库并加入DataFrame

    import pandas as pd import sys import imp imp.reload(sys) from sqlalchemy import create_engine impor ...

  3. 《Lua程序设计》第3章 表达式 学习笔记

    3.1 算术操作符“+”(加法).“-”(减法).“*”(乘法).“/”(除法).“^”(指数).“%”(取模).3.2 关系运算符< > <= >= == ~=3.3 逻辑操 ...

  4. 节日换肤通用技术方案__iOS端实现

    一.问题的提出 不知道大家有没有发现, 元旦期间, 很多APP界面里的图标都换成了具有节日气氛的样式, 而在过了元旦节之后, 这些图标又悄无声息的变回了本来的面貌. 这些具有短暂生命周期.而又必须在固 ...

  5. 由于更换硬盘没有删除系统自启动读取挂载硬盘导致系统报错:fsck.ext4 unable to resolve 'UUID=a4a7a0f7-b54f-4774-9fb1'

    由于更换硬盘没有删除系统自启动读取挂载硬盘导致系统报错:fsck.ext4 unable to resolve 'UUID=a4a7a0f7-b54f-4774-9fb1' 此时进入系统已root模式 ...

  6. Delphi XE开发 Android 开机自动启动

    https://blog.csdn.net/tanqth/article/details/74357209 Android 下的广播 在Android下,要让我们开发的APP能在开机时自动启动,必须使 ...

  7. 日记整理---->2017-05-17

    起始时间是2017-05-17,记录一下spring的学习过程.陌生人可以变成熟人,但熟人一旦变成陌生人,就再也回不去了. 一.测试一下init-method和depend-on huhx.xml文件 ...

  8. C++ 输入输出流 文本文件 二进制文件读写

    文本文件/ASCII文件(能直接显示内容,费存储空间):文件中每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件或称字符文件. 二进制文件(不能显示内容,节 ...

  9. Python OS 文件/目录方法

    Python OS 文件/目录方法 os 模块提供了非常丰富的方法用来处理文件和目录.常用的方法如下表所示: 序号 方法及描述 1 os.access(path, mode) 检验权限模式 2 os. ...

  10. Linux下进程隐藏的方法及其对抗

    零.背景 在应急响应中,经常碰到ps命令和top命令查不到恶意进程(异常进程)的情况,会对应急响应造成很大的影响.轻则浪费时间,重则排查不出问题,让黑客逍遥法外.所以这篇博客研究学习如何对抗linux ...