在线询问区间众数,传统的分块(记录块间众数和每个权值的出现次数)做法被卡空间(分块用的空间是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. 在城市后面加上省,市,区 以及将MySQL入库脚本封装成class

    在城市后面加省,市,区时,使用过滤器和for循环,if判断 一起使用.   自定义一个过滤器 def my_detail(val):                                  ...

  2. vue的理解

    vue提供的MVVM框架模式的数据双向绑定,实现了HTML和js的代码分离,提高代码的维护性 vue.js的核心思想包括:数据驱动和组件化思想. 如果没有中间的ViewModel则关系图编程下面所示: ...

  3. javascrpit的理解

    1.什么是Javascrpt? 轻量级 .编程语言 HTML+css -->设计 参数的默认值设置 函数的闭包: 浏览器加载整个页面的过程 浏览器:多线程 1.js引擎 2.UI渲染 3.事件线 ...

  4. day16 Hbase day17

    这个HBase学习了第二遍也不是太透彻PS:启动Hbase之前先启动Zookeeper.HDFS.yarn 1. hbase简介(是基于HDFS.相当于是一个缓存层) 1.1. 什么是hbase(列式 ...

  5. WCF 学习总结5 -- 消息拦截实现用户名验证(转)

    WCF建立在基于消息的通信这一概念基础上.通过方法调用(Method Call)形式体现的服务访问需要转化成具体的消息,并通过相应的编码(Encoding)才能通过传输通道发送到服务端:服务操作执行的 ...

  6. linux后台运行之&和nohup区别,模拟后台守护进程

    先来看一下&的使用 root@BP:~# cat test.sh #!/bin/bash while true do echo "linux">/dev/null d ...

  7. Nginx配置基于ip的虚拟主机

    我是在centos7虚拟机上进行实验的 该实验基于添加好ip的基础上,如何给网卡添加ip请查阅我的博客 先来看一下我的ip [root@localhost nginx]# ifconfig ens33 ...

  8. madlib centos yum 包安装

    使用centos 测试安装madlib sql 机器学习类库 安装步骤 添加pg 10 repo yum install https://download.postgresql.org/pub/rep ...

  9. 求两个数的平均值,不能只用(a+b)/2的方法

    #include<stdio.h> int avg1(int a, int b) { //利用移位操作符 //右移移位相当于——>除以2 :(a+b)>>1 //考虑到溢 ...

  10. 求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字

    思路:所求和为一个数字的前n项和,例如前4项和就是从4+44+444+4444,一直加到第4位,为4个4.所以可以用一个循环来表示每一项的数字,加到前几项就循环几次.然后将每项进行相加就可以求出总和. ...