bzoj4865: [Ynoi2017]由乃运椰子
在线询问区间众数,传统的分块(记录块间众数和每个权值的出现次数)做法被卡空间(分块用的空间是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]由乃运椰子的更多相关文章
- bzoj 3597: [Scoi2014]方伯伯运椰子 0/1分数规划
3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 144 Solved: 78[Submit][Status ...
- bzoj 3597: [Scoi2014]方伯伯运椰子 [01分数规划 消圈定理 spfa负环]
3597: [Scoi2014]方伯伯运椰子 题意: from mhy12345 给你一个满流网络,对于每一条边,压缩容量1 需要费用ai,扩展容量1 需要bi, 当前容量上限ci,每单位通过该边花费 ...
- bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环
3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 594 Solved: 360[Submit][Statu ...
- 「SCOI2014」方伯伯运椰子 解题报告
「SCOI2014」方伯伯运椰子 可以看出是分数规划 然后我们可以看出其实只需要改变1的流量就可以了,因为每次改变要保证流量守恒,必须流成一个环,在正负性确定的情况下,变几次是无所谓的. 然后按照套路 ...
- 【BZOJ3597】方伯伯运椰子(分数规划,网络流)
[BZOJ3597]方伯伯运椰子(分数规划,网络流) 题解 给定了一个满流的费用流模型 如果要修改一条边,那么就必须满足流量平衡 也就是会修改一条某两点之间的路径上的所有边 同时还有另外一条路径会进行 ...
- 3597: [Scoi2014]方伯伯运椰子[分数规划]
3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MB Submit: 404 Solved: 249 [Submit][Sta ...
- bzoj 3597: [Scoi2014]方伯伯运椰子
Description Input 第一行包含二个整数N,M 接下来M行代表M条边,表示这个交通网络 每行六个整数,表示Ui,Vi,Ai,Bi,Ci,Di 接下来一行包含一条边,表示连接起点的边 Ou ...
- bzoj 3597 [Scoi2014] 方伯伯运椰子 - 费用流 - 二分答案
题目传送门 传送门 题目大意 给定一个费用流,每条边有一个初始流量$c_i$和单位流量费用$d_i$,增加一条边的1单位的流量需要花费$b_i$的代价而减少一条边的1单位的流量需要花费$a_i$的代价 ...
- 2019.03.28 bzoj3597: [Scoi2014]方伯伯运椰子(01分数规划)
传送门 题意咕咕咕有点麻烦不想写 思路: 考虑加了多少一定要压缩多少,这样可以改造边. 于是可以通过分数规划+spfaspfaspfa解决. 代码: #include<bits/stdc++.h ...
随机推荐
- 本地存储之application cache和localstorage
http://blog.csdn.net/kingliguo/article/details/52637087
- EasyUI 文本框回车和普通回车
easyui 回车 $('#Destination_Code').textbox('textbox').bind('keypress', function (e) { ) { } } 普通回车 < ...
- JOISC2019 简要题解
第18回 日本情報オリンピック 春合宿 オンラインコンテスト (JOISC2019) 官网 Day 1 試験 (Examination) description 有\(N\)个学生,每个学生有两科成绩 ...
- java 8大数据类型
第一类:逻辑型boolean 第二类:文本型char 1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a=' ...
- 20165308《Java程序设计》第7周学习总结
20165308<Java程序设计>第7周学习总结 教材学习内容总结 第十一章:JDBC与MySQL数据库 MySQL数据库管理系统 启动MySQL数据库服务器 MySQL客户端管理工具 ...
- webpack 4 升级点
webpack 4 升级点: 默认entry为./src,默认output为/dist sideEffects 在webapck2开始支持ESModule后,webpack提出了tree-shakin ...
- hbase java 基本例子
一下代码实用 0.99.0 以后的版本. package hadoop; import java.io.IOException; import java.util.ArrayList; import ...
- 使用JMeter进行RESTful API测试
使用JMeter进行RESTful API测试 在哪里设置实现最优脚本重用的属性 由于支持云的应用程序通常可以轻松.快速地进行复制和部署,所以可以在多种环境中对其进行测试.如果您需要在多个环境中测试和 ...
- C# 集合、字典、栈和队列
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- JSON C# Class Generator ---由json字符串生成C#实体类的工具
json作为互联网上轻量便捷的数据传输格式,越来越受到重视.但在服务器端编程过程中,我们常常希望能通过智能提示来提高编码效率.JSON C# Class Generator 能将json格式所表示的J ...