在线询问区间众数,传统的分块(记录块间众数和每个权值的出现次数)做法被卡空间(分块用的空间是O(块数*(块数+权值种类数))),因此考虑去掉出现次数较小的数,只用分块维护出现次数较大的数。设K为分界线,用原来的分块维护原序列中出现次数>K的数组成的部分,而出现次数<=K的数,可以通过记录一个数前面第1~K个相同的数的位置,用线段树维护,线段树查询时利用单调性单次询问可以做到$O(k+logn)$,不会成为瓶颈。

当K取$O(n^{1/4})$时,时间复杂度仍是$O(q\sqrt{n})$,空间复杂度为$O(n^{5/4})$

#include<bits/stdc++.h>
char buf[],*ptr=buf+;
int g(){
if(ptr-buf==)fread(buf,,,stdin)[buf]=,ptr=buf;
return *ptr++;
}
int __(){
int x=,c=g();
while(c<)c=g();
while(c>)x=x*+c-,c=g();
return x;
}
int _(){
if(ptr-buf>)return __();
int x=,c=*ptr++;
while(c<)c=*ptr++;
while(c>)x=x*+c-,c=*ptr++;
return x;
}
typedef unsigned short u16;
int n,m;
int v0[],vs[],B,v1[],vp1=;
u16 bc[][],ws[],t[],rid[],bb[][],pv[],pw[];
int ls[],rs[];
u16 tr[][];
int max(int a,int b){return a>b?a:b;}
int get(int l,int r){
int p=;
for(int a=l+,b=r+;b-a!=&&p<;a>>=,b>>=){
if(~a&)while(p<&&tr[a^][p]>=l)++p;
if(b&)while(p<&&tr[b^][p]>=l)++p;
}
return p+;
}
int main(){
n=_();m=_();
for(int i=;i<=n;++i)vs[i]=v0[i]=_();
std::sort(vs+,vs+n+);
for(int i=;i<=n;++i)v0[i]=std::lower_bound(vs+,vs+n+,v0[i])-vs;
for(int i=;i<=n;++i){
int x=v0[i];
pv[i]=pw[x];
pw[x]=i;
for(int j=,z=pv[i];j<;++j)tr[i+][j]=z,z=pv[z];
}
for(int i=;i;--i){
int a=i<<,b=a^;
for(int j=;j<;++j)tr[i][j]=max(tr[a][j],tr[b][j]);
}
for(int i=;i<=n;++i)++t[v0[i]];
int idp=;
for(int i=;i<=n;++i)if(t[i]>)rid[i]=++idp; for(int i=;i<=n;++i)if(rid[v0[i]]){
v1[++vp1]=rid[v0[i]];
v0[i]=vp1;
}else v0[i]=v0[i-];
for(int i=;i<=n;++i)t[i]=;
n=vp1;
for(B=;n/B>;++B);
for(int l=,r=B,c=;l<=n;l+=B,r+=B,++c){
if(r>n)r=n;
ls[c]=l;rs[c]=r;
for(int i=ls[c];i<=rs[c];++i)ws[i]=c;
for(int b=c;b;--b){
bb[c][b]=bb[c][b+];
for(int i=ls[b];i<=rs[b];++i)if(v1[i]){
int x=++bc[c][v1[i]];
if(x>bc[c][bb[c][b]])bb[c][b]=v1[i];
}
}
}
int la=;
while(m--){
int L=_()^la,R=_()^la;
int a0=get(L,R);
L=v0[L-]+;R=v0[R];
int l=ws[L],r=ws[R];
if(a0<)la=a0;
else if(r-l<=){
la=a0;
for(int i=L;i<=R;++i){
int x=v1[i];
if(x&&++t[x]>la)la=t[x];
}
for(int i=L;i<=R;++i)--t[v1[i]];
}else{
--r,++l;
int mx=bb[r][l];
u16*s1=bc[r],*s2=bc[l-];
for(int i=rs[l-];i>=L;--i){
int x=v1[i];
int t1=++t[x]+s1[x]-s2[x];
if(t1>t[mx]+s1[mx]-s2[mx])mx=x;
}
for(int i=ls[r+];i<=R;++i){
int x=v1[i];
int t1=++t[x]+s1[x]-s2[x];
if(t1>t[mx]+s1[mx]-s2[mx])mx=x;
}
la=max(a0,t[mx]+bc[r][mx]-bc[l-][mx]);
for(int i=rs[l-];i>=L;--i)--t[v1[i]];
for(int i=ls[r+];i<=R;++i)--t[v1[i]];
}
printf("-%d\n",la);
}
return ;
}

bzoj4865: [Ynoi2017]由乃运椰子的更多相关文章

  1. bzoj 3597: [Scoi2014]方伯伯运椰子 0/1分数规划

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 144  Solved: 78[Submit][Status ...

  2. bzoj 3597: [Scoi2014]方伯伯运椰子 [01分数规划 消圈定理 spfa负环]

    3597: [Scoi2014]方伯伯运椰子 题意: from mhy12345 给你一个满流网络,对于每一条边,压缩容量1 需要费用ai,扩展容量1 需要bi, 当前容量上限ci,每单位通过该边花费 ...

  3. bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 594  Solved: 360[Submit][Statu ...

  4. 「SCOI2014」方伯伯运椰子 解题报告

    「SCOI2014」方伯伯运椰子 可以看出是分数规划 然后我们可以看出其实只需要改变1的流量就可以了,因为每次改变要保证流量守恒,必须流成一个环,在正负性确定的情况下,变几次是无所谓的. 然后按照套路 ...

  5. 【BZOJ3597】方伯伯运椰子(分数规划,网络流)

    [BZOJ3597]方伯伯运椰子(分数规划,网络流) 题解 给定了一个满流的费用流模型 如果要修改一条边,那么就必须满足流量平衡 也就是会修改一条某两点之间的路径上的所有边 同时还有另外一条路径会进行 ...

  6. 3597: [Scoi2014]方伯伯运椰子[分数规划]

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MB Submit: 404  Solved: 249 [Submit][Sta ...

  7. bzoj 3597: [Scoi2014]方伯伯运椰子

    Description Input 第一行包含二个整数N,M 接下来M行代表M条边,表示这个交通网络 每行六个整数,表示Ui,Vi,Ai,Bi,Ci,Di 接下来一行包含一条边,表示连接起点的边 Ou ...

  8. bzoj 3597 [Scoi2014] 方伯伯运椰子 - 费用流 - 二分答案

    题目传送门 传送门 题目大意 给定一个费用流,每条边有一个初始流量$c_i$和单位流量费用$d_i$,增加一条边的1单位的流量需要花费$b_i$的代价而减少一条边的1单位的流量需要花费$a_i$的代价 ...

  9. 2019.03.28 bzoj3597: [Scoi2014]方伯伯运椰子(01分数规划)

    传送门 题意咕咕咕有点麻烦不想写 思路: 考虑加了多少一定要压缩多少,这样可以改造边. 于是可以通过分数规划+spfaspfaspfa解决. 代码: #include<bits/stdc++.h ...

随机推荐

  1. const 和let的本质区别

    在let和const之间,建议优先使用const,尤其是在全局环境,不应该设置变量,只应设置常量. const优于let有几个原因.一个是const可以提醒阅读程序的人,这个变量不应该改变:另一个是c ...

  2. C++学习(二十三)(C语言部分)之 指针4

    指针 指针 存放地址 只能存放地址 使用 &取地址运算符 *取值 解引用运算符 malloc 申请堆内存 free释放堆内存 1.1 指针 存放的地址(变量地址 常量区的地址 堆区内存首地址 ...

  3. 自定义ThreadPoolExecutor带Queue缓冲队列的线程池 + JMeter模拟并发下单请求

    .原文:https://blog.csdn.net/u011677147/article/details/80271174 拓展: https://github.com/jwpttcg66/GameT ...

  4. prufer数列

    涨姿势---prufer数列 一. 简介 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2.它 ...

  5. Next.js v4.1.4 文档中文翻译【转载】

    最近想稍稍看下 React的 SSR框架 Next.js,因为不想看二手资料, 所以自己跑到 Github上看,Next.js的文档是英文的,看倒是大概也能看得懂, 但有些地方不太确定,而且英文看着毕 ...

  6. 关于Spring IOC的学习和理解

    面向对象——三层架构(表现层.业务层.持久层) 三层架构:即表现层.业务层.持久层. ① 持久层:采用DAO模式,建立实体类和数据库表映射(ORM映射).也就是哪个类对应哪个表,哪个属性对应哪个列.持 ...

  7. Kettle入门--作业和转换的使用

    本来想在centos7下部署的,发现因为java版本的问题,无法成功部署,无奈,转到windows平台(后来找到解决方法了,在centos7系统下yum install webkitgtk* -y 就 ...

  8. Rendering on the Web

    转自: https://developers.google.com/web/updates/2019/02/rendering-on-the-web Rendering on the Web Goog ...

  9. 【HI3520DV200】sample

    1.vdec不支持1280x720,支持640x480及以下

  10. angular学习第一天——安装batarang踩到的那些坑儿

      angularjs作为一个新兴的JavaScript框架,因其具有不少新特性,比如mvc开发模块,双向数据绑定等等,使其名声大噪.我也久闻其大名,然而因为时间问题,一直都没有去接触过他.这几天工作 ...