正经题解在最下面

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

观察题目,发现一串数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. 2017ACM暑期多校联合训练 - Team 6 1011 HDU 6106 Classes (容斥公式)

    题目链接 Problem Description The school set up three elective courses, assuming that these courses are A ...

  2. 知乎大神对IAAS,SAAS,PAAS区别的理解

    你一定听说过云计算中的三个“高大上”的你一定听说过云计算中的三个“高大上”的概念:IaaS.PaaS和SaaS,这几个术语并不好理解.不过,如果你是个吃货,还喜欢披萨,这个问题就好解决了!好吧,其实你 ...

  3. 使用Bash时的几点总结

    作为一个天天与Linux打交道,并以此为生的Linux运维工程师,最常用的工具性语言恐怕就是shell了, 而对于大多数的Linux和一些类Unix而言,其默认的shell就是Bash.使用Bash一 ...

  4. ORA-01552 非系统表空间不能使用系统回滚段处理

    今天新搭建了一个10g的测试数据库,运行都很正常,但是在打开autotrace功能后执行语句,报错 SQL> set autotrace on SQL> select username,s ...

  5. python开发规范(转载)

    转载自http://www.cnblogs.com/wangcp-2014/p/4838952.html 目录 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行 ...

  6. Linux内核中的队列 kfifo【转】

    转自:http://airekans.github.io/c/2015/10/12/linux-kernel-data-structure-kfifo#api 在内核中经常会有需要用到队列来传递数据的 ...

  7. sicily 1017. Rate of Return

    Description Jill has been investing in a mutual fund for a while. Since her income has varied, the a ...

  8. leetcode 之Valid Sudoku(七)

    判断行.列.九宫格内数字是否重复. 按照行.列.九宫格进行检查即可. bool validSudoku(const vector<vector<char>>& boar ...

  9. curd 插件

    1. Django项目启动 自动加载文件 制作启动文件 . 注册strak 在apps.py 类里面增加如下 def ready(self): from django.utils.module_loa ...

  10. (转)Opencv卷积操作

    转自:http://www.2cto.com/kf/201312/267308.html Mask Operation filter2D函数 Last Edit 2013/12/24 所谓的Mask ...