题目链接

洛谷.

Solution

思路同[BZOJ2724] [Violet 6]蒲公英,只不过由于lxl过于毒瘤,我们有一些更巧妙的操作。

首先还是预处理\(f[l][r]\)表示\(l\sim r\)块的众数数量,注意这里不要求具体是什么,我们就有一些奇技淫巧了。

当然第一步还是离散化,对于权值为\(v\)的点,我们开一个\(vector\)来从小到大存这个权值在哪里出现过,在记个\(pos[i]\)表示\(i\)在$vector $内的下标是什么。

那么预处理\(f[l][r]\)的时候,我们参照区间\(dp\),令\(ans=f[l][r-1]\),然后扫一遍\(r\)这个块,设当前的点为\(i\),那么如果\(pos[i]-ans\)这个\(vector\)内的位置\(x\),满足\(x\geqslant st[l]\),其中\(st[l]\)表示\(l\)块起始位置,那么我们就暴力的\(ans++\)。

至于为什么很显然,留给读者自己思考。

那么询问也可以仿照上面的,中间的整块直接用预处理的答案,左边的倒序枚举,然后右边的顺序枚举,暴力更新答案就好了。

#include<bits/stdc++.h>
using namespace std; void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
} void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');} #define lf double
#define ll long long const int maxn = 8e5+10;
const int inf = 1e9;
const lf eps = 1e-8; vector<int > v[maxn];
int n,m,a[maxn],p[maxn],pos[maxn],bel[maxn],st[maxn],ed[maxn],f[800][800],s[maxn]; int solve(int l,int r) {
int ans=f[bel[l]+1][bel[r]-1];
if(bel[l]==bel[r]) {
for(int i=l;i<=r;i++) s[a[i]]=0;
for(int i=l;i<=r;i++) ans=max(ans,++s[a[i]]);
return ans;
}
for(int i=ed[bel[l]];i>=l;i--)
if(pos[i]+ans<(int)v[a[i]].size())
if(v[a[i]][pos[i]+ans]<=r) ans++;
for(int i=st[bel[r]];i<=r;i++)
if(pos[i]-ans>=0)
if(v[a[i]][pos[i]-ans]>=l) ans++;
return ans;
} int main() {
read(n),read(m);for(int i=1;i<=n;i++) read(a[i]),p[i]=a[i];
sort(p+1,p+n+1);int M=unique(p+1,p+n+1)-p-1,b=sqrt(n);
for(int i=1;i<=n;i++) a[i]=lower_bound(p+1,p+M+1,a[i])-p; for(int i=1;i<=n;i++) v[a[i]].push_back(i),pos[i]=v[a[i]].size()-1; for(int i=1;i<=n;i++) bel[i]=(i-1)/b+1;int cnt=bel[n];
for(int i=1;i<=n;i++) if(bel[i]!=bel[i-1]) st[bel[i]]=i,ed[bel[i]-1]=i-1;
st[1]=1,ed[cnt]=n; for(int x=1;x<=cnt;x++) {
for(int i=st[x];i<=ed[x];i++) s[a[i]]=0;
for(int i=st[x];i<=ed[x];i++) s[a[i]]++,f[x][x]=max(f[x][x],s[a[i]]);
} for(int len=2;len<=cnt;len++)
for(int j=1;j<=cnt-len+1;j++) {
int l=j,r=j+len-1,ans=f[l][r-1];
for(int i=st[r];i<=ed[r];i++) {
if(pos[i]-ans<0) continue;
if(v[a[i]][pos[i]-ans]>=st[l]) ans++;
}f[l][r]=ans;
} int lstans=0;
for(int q=1;q<=m;q++) {
int l,r;read(l),read(r);
l^=lstans,r^=lstans;
write(lstans=solve(l,r));
}
return 0;
}

[luogu5048] [Ynoi2019模拟赛] Yuno loves sqrt technology III的更多相关文章

  1. [Luogu5048] [Ynoi2019模拟赛]Yuno loves sqrt technology III[分块]

    题意 长为 \(n\) 的序列,询问区间众数,强制在线. \(n\leq 5\times 10^5\). 分析 考虑分块,暴力统计出整块到整块之间的众数次数. 然后答案还可能出现在两边的两个独立的块中 ...

  2. [洛谷P5048][Ynoi2019模拟赛]Yuno loves sqrt technology III

    题目大意:有$n(n\leqslant5\times10^5)$个数,$m(m\leqslant5\times10^5)$个询问,每个询问问区间$[l,r]$中众数的出现次数 题解:分块,设块大小为$ ...

  3. 洛谷P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III(分块)

    传送门 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 用蒲公英那个分块的方法做结果两天没卡过去→_→ 首先我们分块,预处理块与块之间的答案,然后每次询问的时候拆成整块和两边剩下的元素 整块的答案很简 ...

  4. Luogu P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III 分块

    这才是真正的$N\sqrt{N}$吧$qwq$ 记录每个数$vl$出现的位置$s[vl]$,和每个数$a[i]=vl$是第几个$vl$,记为$P[i]$,然后预处理出块$[i,j]$区间的答案$f[i ...

  5. P5048 [[Ynoi2019模拟赛]Yuno loves sqrt technology III]

    为什么我感觉这题难度虚高啊-- 区间众数的出现次数- 计算器算一下 \(\sqrt 500000 = 708\) 然后我们发现这题的突破口? 考虑分块出来[L,R]块的众数出现个数 用 \(\text ...

  6. 洛谷 P5048 - [Ynoi2019 模拟赛] Yuno loves sqrt technology III(分块)

    题面传送门 qwq 感觉跟很多年前做过的一道题思路差不多罢,结果我竟然没想起那道题?!!所以说我 wtcl/wq 首先将 \(a_i\) 离散化. 如果允许离线那显然一遍莫队就能解决,复杂度 \(n\ ...

  7. [Ynoi2019模拟赛]Yuno loves sqrt technology III

    题目大意: 给你一个长为n的序列a,m次询问,每次查询一个区间的众数的出现次数,强制在线. 解题思路: 出题人题解 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 首先得离散化. 分块后,预处理Fi, ...

  8. [Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)

    二次离线莫队. 终于懂了 \(lxl\) 大爷发明的二次离线莫队,\(\%\%\%lxl\) 二次离线莫队,顾名思义就是将莫队离线两次.那怎么离线两次呢? 每当我们将 \([l,r]\) 移动右端点到 ...

  9. [Ynoi2019模拟赛]Yuno loves sqrt technology II

    题目大意: 给定一个长为\(n\)的序列,\(m\)次询问,每次查询一个区间的逆序对数. 32MB. 解题思路: 出题人题解 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 二次离线莫队. 对于每个区 ...

随机推荐

  1. 「题目代码」P1066~P1070(Java)

    P1066 谭浩强C语言(第三版)习题8.6 import java.util.*; import java.io.*; import java.math.*; import java.lang.Ch ...

  2. uvaoj 489 - Hangman Judge(逻辑+写代码能力)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. 前台时间格式 2019-03-09T16:00:00.000Z

    问题描述: 本想在前台把字符串格式的日期(2019-03-09)转换成日期格式(2019-03-09 00:00:00),但当把这个参数传到后台去后却变成了2019-03-08T16:00:00.00 ...

  4. Monkey用真机做测试的步骤

    1 必备条件 1) 手机需要先获取root权限: 2) 手机和电脑相连(电脑可以访问手机里面的文件) 2  操作步骤 1) 使用adb devices 命令查看电脑手机是否相连: 下图表示手机已连上电 ...

  5. 现实世界中的 Python

    Python 有多稳定? 非常稳定. 自 1991 年起大约每隔 6 到 18 个月就会推出新的稳定发布版,这种状态看来还将持续下去. 目前主要发布版本的间隔通常为 18 个月左右. 开发者也会推出旧 ...

  6. git 跟踪分支 远程跟踪分支 学习笔记

    远程跟踪分支相当于一个只读仓库指针,从服务器上获取数据,不可以被本地直接修改. 跟踪分支相当于一个本地指针   用于项目更新和迭代. 1跟踪分支  (tracking  branch)   逻辑示意图 ...

  7. JAVA基础:ArrayList和LinkedList区别

    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList ...

  8. ionic 组件学习

    利用css列表多选框: <div class="{{Conceal}}" > <ion-checkbox color="secondary" ...

  9. 1 wait notify

    wait/notify: wait()使线程停止,notify使wait状态的线程继续执行. wait()是Object类的方法,该方法用来将线程置入“预执行队列”,并在wait()方法处停止执行,直 ...

  10. php 面试题

    1.通过哪一个函数,可以把错误转换为异常处理? A:set_error_handlerB:error_reportingC:error2exceptionD:catch 正确答案:A 答案分析:set ...