这才是真正的$N\sqrt{N}$吧$qwq$


记录每个数$vl$出现的位置$s[vl]$,和每个数$a[i]=vl$是第几个$vl$,记为$P[i]$,然后预处理出块$[i,j]$区间的答案$f[i][j]$;

对于$[l,r]$,现将$ans$设为$[l,r]$中整块的答案;对于散块,将散块中的每个数$a[i]=vl$,有对应的$P[i]$,我们用$s[vl]$检查第$P[i]+ans+1$个$vl$对应的位置是否在$[l,r]$,如果在的话就更新答案$ans=ans+1$,并重复上述过程,直到$P[i]+ans+1$不在$[l,r]$中。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ull unsigned long long
#define ll long long
#define R register int
#define pause (for(R i=1;i<=10000000000;++i))
#define OUT freopen("out.out","w",stdout);
using namespace std;
namespace Fread {
static char B[<<],*S=B,*D=B;
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
} inline bool isempty(const char& ch) {return ch<=||ch>=;}
inline void gs(char* s) {register char ch; while(isempty(ch=getchar())); do *s++=ch; while(!isempty(ch=getchar()));}
}using Fread::g; using Fread::gs;
const int N=,M=;
int n,m,T,tot,lst; int cnt[N],pos[N],P[N],a[N],b[N],f[M][M];
vector <int> s[N];
#define pb push_back
signed main() {
n=g(),m=g(),T=pow(n,/2.0); for(R i=;i<=n;++i) a[i]=g(); memcpy(b,a,sizeof(int)*(n+));
sort(b+,b+n+); tot=unique(b+,b+n+)-b-;
for(R i=;i<=n;++i) a[i]=lower_bound(b+,b+tot+,a[i])-b;
for(R i=;i<=n;++i) s[a[i]].pb(i);
for(R i=;i<=n;++i) P[i]=++cnt[a[i]]-; memset(cnt,,sizeof(cnt));
for(R i=;i<=n;++i) pos[i]=(i-)/T+;
for(R p=,L=pos[n],mx=;p<=L;++p,mx=,memset(cnt,,sizeof(cnt))) for(R t=p;t<=L;++t) {
for(R i=(t-)*T+,LL=min(t*T,n);i<=LL;++i) mx=max(++cnt[a[i]],mx);
f[p][t]=mx;
} for(R i=,l,r;i<=m;++i) { R ans=;
l=g()^lst,r=g()^lst;
if(pos[l]==pos[r]) {
for(R i=l;i<=r;++i) ans=max(ans,++cnt[a[i]]); for(R i=l;i<=r;++i) cnt[a[i]]=;
} else { R p=pos[l]+,q=pos[r]-; ans=f[p][q];
for(R i=l,L=pos[l]*T;i<=L;++i) { R tmp=P[i];
while((tmp+ans)<s[a[i]].size()&&s[a[i]][tmp+ans]<=r) ++ans;
} for(R i=q*T+;i<=r;++i) { R tmp=P[i];
while((tmp-ans)>=&&s[a[i]][tmp-ans]>=l) ++ans;
}
} printf("%d\n",lst=ans);
}
}

2019.07.03

Luogu P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III 分块的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

    题目链接 洛谷. Solution 思路同[BZOJ2724] [Violet 6]蒲公英,只不过由于lxl过于毒瘤,我们有一些更巧妙的操作. 首先还是预处理\(f[l][r]\)表示\(l\sim ...

  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. 在Linux环境下的对启动服务进行停止或在运行

    下面我以elasticsearch服务为例进行: 第一种: 1.前台运行: 运行结果 2.ctrl+c停止运行   第二种:后端运行 1.后端运行的命令./elasticsearch -d 这种启动后 ...

  2. APM之原理篇

    APM,应用性能监控,有new relic等产品,对APM感兴趣的应该不会不知道它了.主要功能就是统计分析应用的CPU.内存.网络.数据库.UI等性能,并提供错误日志捕获.编码人员需要做的仅仅是使用它 ...

  3. 题解 CF546C 【Soldier and Cards】

    思路 是一道水题,可以用队列+模拟来写,注意不要拿完队列中的元素! 代码 #include<iostream> #include<cstdio> #include<que ...

  4. python — lambda表达式与内置函数

    目录 1 lambda表达式 (匿名函数) 2 内置函数 1 lambda表达式 (匿名函数) 用于表示简单的函数 lambda表达式,为了解决简单函数的情况: def func(a1,a2): == ...

  5. windows phone 下拉刷新

    在windows phone 中采用数据列表时为了保证用户体验常遇到加载数据的问题.这个问题普遍到只要你用到数据列表就要早晚面对这个问题. 很多人会说这个问题已经有解决方案. 其实真正问题并不在于如何 ...

  6. MUI 支付案例(支付宝/微信)

    首先说明一下,本文借鉴了多位博主的文章,所以会看到很多一样的代码. 写这篇博客主要目的是为了便于后期查看(不好之处,敬请留言吐槽),案例经本人测试,是可以使用的. 先上效果图 前端HTML代码: &l ...

  7. PCQQ - 发送自定义的XML卡片消息

    效果: 原理: qq分享产生的xml卡片消息存储在qq内存中,可以在qq运行内存中搜索找到其xml源码,记录源码相应的内存地址,通过内存地址修改掉内存数据,再次转发这条分享的消息就会发现内容的变化. ...

  8. 【jekins】jenkins构建触发

    一.定时构建的语法 * * * * *(五颗星,中间用空格隔开)第一颗*表示分钟,取值0~59第二颗*表示小时,取值0~23第三颗*表示一个月的第几天,取值1~31第四颗*表示第几月,取值1~12第五 ...

  9. redis——搭建

    https://blog.csdn.net/sinat_29699167/article/details/79699200 Django使用Redis进行缓存详细最全流程 https://blog.c ...

  10. Django—model系统:ORM对数据库操作

    基本操作 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): ...