当前位置: 首页 > 编程日记 > 正文

bzoj2724: [Violet 6]蒲公英(分块)

传送门

md调了一个晚上最后发现竟然是空间开小了……明明算出来够的……

讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有。然而今天做了这道分块的题才发现分块的暴力之美(如果我空间没有开小就更美了)

我们先将整个数组分块,设块的大小为$T$

我们先预处理出所有以块边界为端点的区间的答案,即$ans[L][R]$代表着第$L$块到第$R$块的序列所代表的答案。这个可以$O(n*n/T)$预处理

然后我们先将所有的数给离散化,然后对每一个值都开一个vector,记录这个值在数组中出现的每一个位置。比如数组的下标为1,3,5的位置都是3,那么3的vector记录的就是{1,3,5}

这个有什么用呢?我们设查询的区间为$[l,r]$,然后在这个vector里先二分查找第一个大于等于$l$的数的位置,再二分查找第一个大于$r$的数的位置,那么两个位置一减就是这个数在这个区间中的出现次数。比如查询区间$[2,4]$,我们先找到第一个大于等于2的数3,在vector中下标为2,再找第一个大于4的数为5,下标为3,那么3-2=1就是3这个数字在这个区间中的出现次数

那么,我们设$[L,R]$为查询区间之间的整块,因为我们第一步已经预处理出了所有块与块之间的答案,那么这一段之间的众数也就可以知道。那么,只有区间$[l,L-1]$和$[R+1,r]$之间的数字有可能更新答案。那么我们就去枚举这两个区间中的所有数字,然后用上面说的方法去查询它在整个查询区间内的出现次数,然后更新答案即可

复杂度为$O(n*n/T+n*T*logn)$,设块的大小为$n/sqrt{nlogn}$ ,那么时间复杂度就是$O(nsqrt{nlogn})$

其实还有一种更快的方法是先预处理出块与块之间的答案和各个数的出现次数,然后查询只要在散块里暴力增加并更新答案,之后暴力复原即可(然而我懒并不想打)

然后基本注意点都写在注解里了

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<vector>
 7 #include<cmath>
 8 #define inf 0x3f3f3f3f
 9 using namespace std;
10 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
11 char buf[1<<21],*p1=buf,*p2=buf;
12 inline int read(){
13     #define num ch-'0'
14     char ch;bool flag=0;int res;
15     while(!isdigit(ch=getc()))
16     (ch=='-')&&(flag=true);
17     for(res=num;isdigit(ch=getc());res=res*10+num);
18     (flag)&&(res=-res);
19     #undef num
20     return res;
21 }
22 char sr[1<<21],z[20];int C=-1,Z;
23 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
24 inline void print(int x){
25     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
26     while(z[++Z]=x%10+48,x/=10);
27     while(sr[++C]=z[Z],--Z);sr[++C]='\n';
28 }
29 const int N=40005,M=1005;
30 int ans[M][M],a[N],b[N],cnt[N],rt[N],vis[N];
31 vector<int> pos[N];
32 int n,m,q,lastans=0,s,l,r;
33 inline int query_cnt(int x){
34     //查询数的出现次数,注意l和r要开全局变量 
35     return upper_bound(pos[x].begin(),pos[x].end(),r)-lower_bound(pos[x].begin(),pos[x].end(),l);
36 }
37 void init(){
38     //暴力枚举块与块之间的答案 
39     for(int i=1;i<=rt[n];++i){
40         memset(cnt,0,sizeof(cnt));
41         int bg=s*(i-1)+1,res=a[bg];
42         for(int j=bg;j<=n;++j){
43             ++cnt[a[j]];
44             if(cnt[a[j]]>cnt[res]||(cnt[a[j]]==cnt[res]&&a[j]<res)) res=a[j];
45             ans[i][rt[j]]=res;
46         }
47     }
48 }
49 int query(int l,int r){
50     //查询,小块暴力,大块直接找答案 
51     if(rt[r]-rt[l]<=1){
52         int id=0,res=0;
53         for(int i=l;i<=r;++i)
54         if(!vis[a[i]]){
55             int t=query_cnt(a[i]);
56             if(t>res||(t==res&&a[i]<id)) res=t,id=a[i];
57             vis[a[i]]=1;
58         }
59         for(int i=l;i<=r;++i) vis[a[i]]=0;
60         return b[id];
61     }
62     int L=rt[l]+1,R=rt[r]-1;
63     int LL=(L-1)*s+1,RR=R*s;
64     int id=ans[L][R],res=query_cnt(id);vis[id]=1;
65     for(int i=l;i<LL;++i)
66     if(!vis[a[i]]){
67         int t=query_cnt(a[i]);
68         if(t>res||(t==res&&a[i]<id)) res=t,id=a[i];
69         vis[a[i]]=1;
70     }
71     for(int i=RR+1;i<=r;++i)
72     if(!vis[a[i]]){
73         int t=query_cnt(a[i]);
74         if(t>res||(t==res&&a[i]<id)) res=t,id=a[i];
75         vis[a[i]]=1;
76     }
77     for(int i=l;i<LL;++i) vis[a[i]]=0;
78     for(int i=RR+1;i<=r;++i) vis[a[i]]=0;
79     vis[ans[L][R]]=0;
80     return b[id];
81 }
82 int main(){
83     n=read(),q=read(),s=sqrt(n/(double)(log2(n))+1);
84     //我怕s会变成0所以sqrt里加了个1(可能并不需要) 
85     for(int i=1;i<=n;++i) a[i]=b[i]=read(),rt[i]=(i-1)/s+1;//分块 
86     sort(b+1,b+1+n),m=unique(b+1,b+1+n)-b-1;
87     for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+1+m,a[i])-b,pos[a[i]].push_back(i);
88     //以上是离散 
89     init();
90     while(q--){
91         l=read(),r=read();
92         l=(l+lastans-1)%n+1,r=(r+lastans-1)%n+1;
93         if(l>r) swap(l,r);
94         print(lastans=query(l,r));
95     }
96     Ot();
97     return 0;
98 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9607299.html

相关文章:

Linux0.01内核根目录Makefile注释

# # Makefile for linux. # If you dont have -mstring-insns in your gcc (and nobody but me has :-) # remove them from the CFLAGS defines. ## #8086汇编编译器和连接器. -0生成8086目标程序;-a生成与gas和gld部分兼容的代码 # AS86 as -0 -a CC86 cc -0 LD86 ld -0# #G…

快速滚动_方老师教滚动快速作文

五年级第一单元作文集阴沉天空中有一小束照着你的阳光。亲爱的孩子&#xff0c;让时间在知识的枝条上、智慧的绿叶上、成熟的果实上留下它勤奋的印痕&#xff01;罗婉汀作文集自律且努力&#xff0c;别让生活太安逸。亲爱的孩子&#xff0c;耕耘者最信得过自己的汗水&#xff0…

liunx复制备份命令,copy命令,liunx命令

2019独角兽企业重金招聘Python工程师标准>>> 拷贝到的文件夹 /usr/local/文件夹/需要拷贝的路径文件夹 /usr/local/tomcat/webapps/文件夹/复制命令cp -r /usr/local/文件夹/ /usr/local/tomcat/webapps/文件夹/ 转载于:https://my.oschina.net/u/2336787/blog/635…

20.Valid Parentheses (python)

这道题主要用栈来实现的。什么是栈呢&#xff0c;参照书上的后缀表达式的例子谈谈自己的理解&#xff0c;栈最明显的特征是先进后出。所以可以有效的结合题目中 &#xff08;&#xff09;对匹配问题&#xff0c;可以把从列表中获取的符号先存到栈中。 首先建个空列表用于映射栈…

The HipHop Virtual Machine

目前Facebook已将该HipHop虚拟机开源&#xff0c;源代码发布在GitHub上。关于该工具的技术原理在Facebook的开发者页面上有一篇详细的文章介绍&#xff0c;查看这里。如果看不到的可以看下面的转载&#xff1a;Were always looking for ways to make our computing infrastruct…

node建立博客系统遇到的问题,1,乱码。2,multer的使用错误。3使用session问题...

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0c;乱码 文件存储为utf-8格式后还是报错。 原来这个设置只对新建文件编码有效&#xff0c;旧文件不处理的&#xff0c;我还以为旧文件也给转换了。 2&#xff0c;上传文件的multer模块使用错误。 throw new Ty…

python时间函数入门_calendar在python3时间中有哪些常用函数?怎么用?

想要在python中写代码游刃有余&#xff0c;没有函数的支持是万万不行的。很多小伙伴反映&#xff0c;最近函数的应用知识不够了&#xff0c;所以小编挑选了python3时间中的函数&#xff0c;希望可以帮助大家在处理日历方面更加的迅速。其他更多的函数&#xff0c;大家也可以自行…

9.spark core之共享变量

简介 spark执行操作时&#xff0c;可以使用驱动器程序Driver中定义的变量&#xff0c;但有时这种默认的使用方式却并不理想。 集群中运行的每个任务都会连接驱动器获取变量。如果获取的变量比较大&#xff0c;执行效率会非常低下。每个任务都会得到这些变量的一份新的副本&…

【CSDN2012年度博客之星】需要您的一票,感谢大家的支持

从2004年9月&#xff0c;本人一直将自己工作和学习经验写成博文分享给大家&#xff0c;本人有幸被选为&#xff12;&#xff10;&#xff11;&#xff12;年&#xff18;&#xff18;位候选博客之星&#xff0c;如果各位IT‘er喜欢我的博文&#xff0c;请投我一票&#xff0c;做…

双绞线和同轴电缆

线缆作为连接器件&#xff0c;相当于不同系统之间沟通的“桥梁”&#xff0c;选择线缆类型的好坏&#xff0c;也决定着传输信号的质量&#xff0c;影响着整个系统的稳定性。 &#xff08;1&#xff09;特性阻抗 先说一下关于线缆在传输过程中的特性阻抗问题。 特性阻抗是指电缆…

keras训练完以后怎么预测_使用Keras建立Wide Deep神经网络,通过描述预测葡萄酒价格...

你能通过“优雅的单宁香”、“成熟的黑醋栗香气”或“浓郁的酒香”这样的描述&#xff0c;预测葡萄酒的价格吗&#xff1f;事实证明&#xff0c;机器学习模型可以。在这篇文章中&#xff0c;我将解释我是如何利用Keras(tf.keras)建立一个Wide & Deep神经网络&#xff0c;并…

如何发布自己的NPM包(模块)?

1.注册NPM 账号 注册地址&#xff1a;https://www.npmjs.com/。 2.初始化自己要发布的项目 搭建本地环境&#xff1a;安装node.js&#xff0c;包含了npm命令。新建目录&#xff0c;在该目录下&#xff0c;初始化项目&#xff1a;npm init。按照提示填写初始化信息&#xff0c;我…

PHP对于浮点型的数据需要用不同的方法去解决

Php: BCMathbc是Binary Calculator的缩写。bc*函数的参数都是操作数加上一个可选的 [int scale]&#xff0c;比如string bcadd(string $left_operand, string $right_operand[, int $scale])&#xff0c;如果scale没有提供&#xff0c;就用bcscale的缺省值。这里大数直接用一个…

mysql提示符详解_MySQL字符集使用详解

查看字符集相关变量mysql> show variables like character%;————————–——————————-| Variable_name | Value |————————–——————————-| character_set_client | latin1 || character_set_connection | latin1 || character_set_database…

Apache漏洞修复

今天受同事的委托&#xff0c;修复一台服务器的Apache漏洞&#xff0c;主要集中在以下几点&#xff1a; 1.Apache httpd remote denial of service&#xff08;中危&#xff09; 修复建议&#xff1a;将Apache HTTP Sever升级到2.2.20或更高版本。 解决方法&#xff1a;升级HTT…

Java遍历Map对象的四种方式

关于java中遍历map具体哪四种方式&#xff0c;请看下文详解吧。 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。 1 2 3 4 Map<Integer, Integer> map new HashMap<Integer, Integer>(); for (Map.Entry<Integer, Intege…

Tokyo Cabinet 安装

tokyocabinet :一个key-value的DBM数据库&#xff0c;但是没有提供网络接口&#xff0c;以下称TC。 tokyotyrant :是为TC写的网络接口&#xff0c;他支持memcache协议&#xff0c;也可以通过HTTP操作&#xff0c;以下称TT。 Tokyo Cabinet 是一款 DBM 数据库&#xff0c;Tokyo …

Packagist / Composer 中国全量镜像

Packagist 镜像 请各位使用本镜像的同学注意&#xff1a; 本镜像已经依照 composer 官方的数据源安全策略完全升级并支持 https 协议&#xff01;请各位同学 按照下面所示的两个方法将 http://packagist.phpcomposer.com 修改为 https://packagist.phpcomposer.com 还没安装 co…

centos yum mysql-devel 5.5_CentOS 6.5下yum安装 MySQL-5.5全过程图文教程

在linux安装mysql是一个困难的事情&#xff0c;yum安装一般是安装的mysql5.1&#xff0c;现在经过自己不懈努力终于能用yum安装mysql5.5了。下面通过两种方法给大家介绍CentOS 6.5下yum安装 MySQL-5.5全过程&#xff0c;一起学习吧。方法一&#xff1a;具体方法和步骤如下所示&…

py 的 第 31 天

1.osi 7层模型 5层&#xff1a; 应用层 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 4层&#xff1a; 应用层 应用层 表示层 会话层 传输层 网络层 物理层 数据链路层 物理层 注意&#xff1a;7层背会。 2.tcp的三次握手&…

mysql实训报告_mysql数据库技术》实验报告.doc

mysql数据库技术》实验报告MySQL数据库技术实验报告系 别班 级学 号姓 名地点地点机房课程名称MySQL数据库技术实验名称实验1 MySQL的使用实 验 过 程目的要求&#xff1a;(1)掌握MySQL服务器安装方法(2)掌握MySQL Administrator的基本使用方法(3)基本了解数据库及其对象实验准…

PHP中魔术方法的用法

PHP中魔术方法的用法 /** PHP把所有以__&#xff08;两个下划线&#xff09;开头的类方法当成魔术方法。所以你定义自己的类方法时&#xff0c;不要以 __为前缀。 * */// __toString、__set、__get__isset()、__unset() /*The __toString method allows a class to decide how …

“互联网+”的时代,易佳互联也随着时代步伐前进着

一谈到互联网&#xff0c;我想大家的心里都不陌生&#xff0c;咱们总理工作报告中提出&#xff0c;制定“互联网”行动计划&#xff0c;推动移动互联网、云计算、大数据、物联网等与现代制造业结合&#xff0c;促进电子商务、工业互联网和互联网金融健康发展&#xff0c;引导互…

PHP 获取数组最后一个值

<?PHP$array array(1,2,4,6,8);echo end($array);?> <?PHP$array array(1,2,4,6,8);echo array_pop($array);?> <?PHP$array array(1,2,4,6,8);$k array_slice($array,-1,1);print_r($k); //结果是一维数组?>

解决nginx 502 bad gateway--团队的力量

nginx 502 bad gateway可以采取客户端强制刷新的方法&#xff0c;但是真正的解决要么改配置或者放CDN上。遇到这个问题&#xff0c;首先是有人发现可以加index.html访问&#xff0c;因为我们是线上网站&#xff0c;没有太多时间去研究&#xff0c;所以先临时这样&#xff1b;然…

MYSQL企业常用架构与调优经验分享

小道消息&#xff1a;2016爱维Linux高薪实战运维提高班全新登场,课程大纲&#xff1a;http://www.iivey.com/666-2一、选择Percona Server、MariaDB还是MYSQL1、Mysql三种存储引擎MySQL提供了两种存储引擎&#xff1a;MyISAM和 InnoDB&#xff0c;MySQL4和5使用默认的MyISAM存储…

mysql 5.x 安装_mysql 5.5.x zip直接解压版安装方法

到官网下载mysql-5.5.10-win32.zip&#xff0c;然后将mysql解压到任意路径&#xff0c;如&#xff1a;C:\mysql-5.5.10-win32打开计算机->属性->高级系统设置->环境变量&#xff0c;新建一个环境变量&#xff0c;变量名为&#xff1a;MYSQL_HOME&#xff0c;变量值为你…

阿里云移动数据分析服务使用教程

阿里云大学课程&#xff1a;阿里云移动数据分析服务使用教程课程介绍&#xff1a;移动数据分析 (Mobile Analytics) 是阿里云推出的一款移动App数据统计分析产品&#xff0c;为开发者提供一站式数据化运营服务&#xff1a;通用的多维度用户行为分析、数据开放并支持自定义分析、…

Apache的服务端包含--SSI

SSI定义&#xff1a; SSI&#xff08;服务器端包含&#xff09;提供了一种对现有HTML文档增加动态内容的方法。 作用&#xff1a; 一般出于效率的考虑&#xff0c;网站都会把内容尽可能的静态化成HTML文件&#xff0c;但是网站页面的布局往往比较复杂&#xff0c;各个部分的更新…

mysql校对规则_MySQL中的校对规则

详解MySQL中的校对规则Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 7Server version: 5.6.14 MySQL Community Server (GPL)Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.Oracle is a registered…