正经题解在最下面

写的时候看了大神的题解[就是上面那个网址],看到下面这段话

观察题目,发现一串数s(l~r)整除p满足s(l~n-1)%p==s(r+1~n-1)%p 
但p值为2或5不满足这个性质需要特判(不过数据中好像没有,于是笔者没写,有兴趣的可以自己去写写。。。。。。)

然后问题转化为求一段区间中有几对相等的f值。

看到这里,我感觉豁然开朗,完全忽视了离散化的要求,我以为把余数值存起来扫一遍就行了离散个p啊..

写着写着完全参透这道题之后发现离散化的是余数啊,你不离散化怎么存数量啊,不存某个余数数量硬扫肯定超时啊....

然后我暴力硬扫果然[dian]超时了.........

然后老老实实写离散化..........

 最重要的:2和5要特判
 
更重要的:离散化的时候要注意判定0的情况...即等于0时特判,不等0时离散化的赋值不应该从0开始,看加注释的那一段即可,不然会像我一样不停错两个点.....
我的程序200+大牛程序100-行..被吊着打.......我觉得我写的还挺清晰的...虽然完全不简洁
 #include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int p,m,s=,sz;
int a[]={};
int bel[]={};
int ans[]={};
long long mo[]={};
long long b[]={};
long long re[][]={};
int vis[]={};
int tot[]={};
struct nod{
int x,y;
int id;
}e[];
void readin(){
char c=getchar();
while(c<''||c>''){
c=getchar();
}
while(c>=''&&c<=''){
a[++s]=(int)(c-'');
c=getchar();
}
}
bool mmp(nod aa,nod bb){
if(bel[aa.x]==bel[bb.x]){
if(aa.y==bb.y){
return aa.x<bb.x;
}
return aa.y<bb.y;
}
return bel[aa.x]<bel[bb.x];
}
void work(){
int l=,r=;
int an=;
for(int i=;i<=m;i++){
while(l>e[i].x){
l--;
an+=vis[mo[l]];
if(mo[r+]==mo[l]){
an+=;
}
vis[mo[l]]++;
}
while(r<e[i].y){
r++;
vis[mo[r]]++;
an+=vis[mo[r+]];
}
while(l<e[i].x){
vis[mo[l]]--;
an-=vis[mo[l]];
if(mo[r+]==mo[l]){
an-=;
}
l++;
}
while(r>e[i].y){
an-=vis[mo[r+]];
vis[mo[r]]--;
r--;
}
ans[e[i].id]=an;
}
for(int i=;i<=m;i++){
printf("%d\n",ans[i]);
}
}
void work5(){
int l=,r=;
int an=;
for(int i=;i<=m;i++){
while(l>e[i].x){
l--;
vis[a[l]%p]++;
an+=vis[];
}
while(r<e[i].y){
r++;
vis[a[r]%p]++;
if(a[r]%p==){
an+=r-l+;
}
}
while(l<e[i].x){
an-=vis[];
vis[a[l%p]]--;
l++;
}
while(r>e[i].y){
if(a[r]%p==){
an-=r-l+;
}
vis[a[r]%p]--;
r--;
}
ans[e[i].id]=an;
}
for(int i=;i<=m;i++){
printf("%d\n",ans[i]);
}
}
int main(){
//freopen("wtf.in","r",stdin);
scanf("%d",&p);
readin();
sz=(int)sqrt((double)s);
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d",&e[i].x,&e[i].y);
if(e[i].x>=s){
e[i].x=s;
}
if(e[i].y>s){
e[i].y=s;
}
e[i].id=i;
}
for(int i=;i<=s;i++){
bel[i]=(i-)/sz+;
}
sort(e+,e++m,mmp);
if(p==||p==){
work5();
return ;
}
for(int i=;i<=;i++){
re[i][]=i%p;
tot[i]=;
}
for(int i=s,w=;i>=;i--){
int x=a[i];
while(tot[x]<w){
tot[x]++;
re[x][tot[x]]=re[x][tot[x]-]*%p;
}
mo[i]=(re[x][w]+mo[i+])%p;
b[i]=mo[i];
w++;
}
sort(b+,b++s);
int size=unique(b+,b++s)-b-;
for(int i=;i<=s;i++){//离散化部分....注意一定要特判..
if(mo[i]==){
mo[i]==;
}
else{
mo[i]=lower_bound(b+,b++s,mo[i])-b;//这里-1且输入字符串中没有0时,1会被离散化为0
}
}
work();
return ;
}

[BZOJ4542] [JZYZOJ2014][Hnoi2016] 大数(莫队+离散化)的更多相关文章

  1. 【BZOJ4542】[Hnoi2016]大数 莫队

    [BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...

  2. 【bzoj4542】[Hnoi2016]大数 莫队算法

    题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...

  3. [BZOJ4542] [Hnoi2016] 大数 (莫队)

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  4. bzoj4542 [Hnoi2016]大数 莫队+同余

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4542 题解 我们令 \(f_i\) 表示从 \(i\) 到 \(n\) 位组成的数 \(\bm ...

  5. BZOJ.4542.[HNOI2016]大数(莫队)

    题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...

  6. 洛谷P3245 [HNOI2016]大数(莫队)

    题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...

  7. bzoj 4542: [Hnoi2016]大数 (莫队)

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  8. [HNOI2016]序列(莫队,RMQ)

    [HNOI2016]序列(莫队,RMQ) 洛谷  bzoj 一眼看不出来怎么用数据结构维护 然后还没修改 所以考虑莫队 以$(l,r-1) -> (l,r)$为例 对答案的贡献是$\Sigma_ ...

  9. 【bzoj4542】 Hnoi2016—大数

    http://www.lydsy.com/JudgeOnline/problem.php?id=4542 (题目链接) 题意 给出一个素数$P$,一个数串$S$,$m$个询问,每次询问区间$[l,r] ...

随机推荐

  1. 20155117王震宇 2016-2017-2 《Java程序设计》第九周学习总结

    教材学习内容总结 JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据 ...

  2. python学习笔记(十)之格式化字符串

    格式化字符串,可以使用format方法.format方法有两种形式参数,一种是位置参数,一种是关键字参数. >>> '{0} {1}'.format('Hello', 'Python ...

  3. layui结合mybatis的pagehelper插件的分页通用的方法

    总体思路: 1.前台查询的时候将当前页和页大小传到后台 2.后台将当前页,页大小以及数据与数据总数返回前台,前台显示完表格完数据之后显示分页插件. 前台页面: 准备查询条件的表单,与数据表格,分页di ...

  4. CentOS 6.6下目录结构及其主要作用

    今天我们总结一下CentOS 6.6的linux的目录结构,一个系统的目录众多,这里我们主要认识一下,根目录下的主要目录,首先我们可以通过tree命令查看一次根目录下一层目录都有什么目录, 补充:不能 ...

  5. iOS 取消按钮高亮显示方法

    objective-C 第1种方法: 设置按钮的normal 与 highlighted 一样的图片, 不过如果你也需要selected状态下的图片, 就不能这么做, 这样做在取消选中状态的时候就会显 ...

  6. ORACLE数据库导出导入数据

    准备工作: 1.登录管理员system 2.create directory dbdata as 'C:\oracle\tempData';--创建备份文件夹 3.grant read,write o ...

  7. ansible安装配置及最佳实践roles

    ansible是什么? ansible是一款轻量级配置管理工具,用于远程批量部署.安装.配置.类似的还有puppet.saltstack,各有所长,任君自选. 官方文档:http://docs.ans ...

  8. java之正则表达式、日期操作

    正则表达式和日期操作 正则表达式简介 正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式规则,然后使用该格式规则匹配某个字符串是否符合格式要求. 作用:比如注册邮箱,邮箱有用户名和密码,一 ...

  9. webservice使用

    soap方法 一:PHP本身的SOAP 所有的webservice都包括服务端(server)和客户端(client). 要使用php本身的soap首先要把该拓展安装好并且启用.下面看具体的code ...

  10. (六)Spring4 整合Hibernate4,Struts2

    第一节:S2SH 整合所需Jar 包 Struts2.3.16,Spring4.0.6,Hibernate4.3.5 整合所需jar 包: Struts2.3.16 jar 包 Spring4.0.6 ...