【bzoj4542】[Hnoi2016]大数


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; typedef long long LL; #define N 100010 struct Node
{
LL val;
int id;
}md[N]; struct data
{
int l,r,id;
}ask[N]; char s[N]; LL c[N],d[N],h[N];
LL a[N]; LL p;
int m,n;
int l,r; int len,K; int cmp(Node aa,Node bb)
{
return aa.val<bb.val;
} int cmp2(data aa,data bb)
{
return aa.l/K==bb.l/K ? aa.r<bb.r : aa.l<bb.l;
} void work()
{
for (int i=;i<=len;i++)
{
d[i]=d[i-]+((s[i-]-'')%p ? : i);
c[i]=c[i-]+((s[i-]-'')%p==);
}
scanf("%d",&m);
while (m--)
{
scanf("%d%d",&l,&r);
printf("%lld\n",d[r]-d[l-]-(c[r]-c[l-])*(l-));
}
} int main()
{
scanf("%lld",&p);
scanf("%s",s);
len=strlen(s);
K=sqrt(len)+;
if (p== || p==)
{
work();
return ;
}
LL res=;
for (int i=len-;i>=;i--)
{
md[i].val=(md[i+].val+(s[i]-'')*res)%p;
md[i].id=i;
res=res*%p;
}
md[len].id=len;
sort(md,md+len+,cmp);
res=;
for (int i=;i<=len;i++)
{
if (i && md[i].val!=md[i-].val)
res++;
h[md[i].id]=res;
}
scanf("%d",&m);
for (int i=;i<=m;i++)
{
scanf("%d%d",&ask[i].l,&ask[i].r);
ask[i].l--;
ask[i].id=i;
}
sort(ask,ask+m,cmp2);
int L(),R(-);
res=;
for (int i=;i<m;i++)
{
while (R<ask[i].r)
res+=c[h[++R]]++;
while (R>ask[i].r)
res-=--c[h[R--]];
while (L>ask[i].l)
res+=c[h[--L]]++;
while (L<ask[i].l)
res-=--c[h[L++]];
a[ask[i].id]=res;
}
for (int i=;i<m;i++)
printf("%lld\n",a[i]);
return ;
}
【bzoj4542】[Hnoi2016]大数的更多相关文章
- BZOJ4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- [BZOJ4542] [Hnoi2016] 大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- bzoj4542: [Hnoi2016]大数(莫队)
这题...离散化...$N$和$n$搞错了...查了$2h$...QAQ 考虑$s[l...r]$,可以由两个后缀$suf[l]-suf[r+1]$得到$s[l...r]$代表的数乘$10^k$得到的 ...
- 【莫队】bzoj4542: [Hnoi2016]大数
挺有意思的,可以仔细体味一下的题:看白了就是莫队板子. Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小 ...
- bzoj4542 [Hnoi2016]大数 莫队+同余
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4542 题解 我们令 \(f_i\) 表示从 \(i\) 到 \(n\) 位组成的数 \(\bm ...
- 【BZOJ4542】[Hnoi2016]大数 莫队
[BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...
- 【LG3245】[HNOI2016]大数
[LG3245][HNOI2016]大数 题面 洛谷 题解 60pts 拿vector记一下对于以每个位置为右端点符合要求子串的左端点, 则每次对于一个询问,扫一遍右端点在vector里面二分即可, ...
- 4542: [Hnoi2016]大数
4542: [Hnoi2016]大数 链接 分析: 如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可. 如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\f ...
- HNOI2016(BZOJ4542) 大数
HNOI2016 Day2 T3 大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P ...
- 【bzoj4542】 Hnoi2016—大数
http://www.lydsy.com/JudgeOnline/problem.php?id=4542 (题目链接) 题意 给出一个素数$P$,一个数串$S$,$m$个询问,每次询问区间$[l,r] ...
随机推荐
- Linux安装64位Mysql5.7.22
以安装在/usr/local目录下为例 1.下载安装包地址:https://dev.mysql.com/downloads/file/?id=476936,安装包保存到/usr/local 2.解压: ...
- js 实现弹力球效果
1.html代码: <div id='imgid'> <img src="img/5.png"> </div> 2.js代码: imgobj=d ...
- Linux环境下验证码不显示F12报500
前言: 项目之前部署在linux系统上进行测试,今天重新部署的时候,重启了tomcat然后部署新的版本项目,结果登录页面验证码不显示,在浏览器F12页面显示的是500错误.网上查了很多方法,都没效果 ...
- 20Spring切面的优先级
通过使用@order注解指定切面的优先级,值越小,优先级越高代码: package com.cn.spring.aop.impl; //加减乘除的接口类 public interface Arithm ...
- 有趣的鼠标悬浮模糊效果总结---(filter,渐变文字)
绘制渐变背景图 第一种:大神的想法,摘抄 background-image: -webkit-linear-gradient(left, blue, red 25%, blue 50%, red 75 ...
- 谷歌浏览器添加Bing搜索引擎:
谷歌浏览器添加Bing搜索引擎: https://www.bing.com/search?q=%s&pc=MOZI&form=MOZLBR
- C51 静态数码管 个人笔记
显示器介绍 单片机系统中常用的显示器有: LED(Light Emitting Diode):发光二极管显示器 LCD(Liquid Crystal Display)液晶显示器 TFT 液晶显示器等. ...
- ajax异步获取数据后动态向表格中添加数据(行)
因为某些原因,项目中突然需要做自己做个ajax异步获取数据后动态向表格中添加数据的页面,网上找了半天都没有 看到现成的,决定自己写个例子 1.HTML页面 <!doctype html> ...
- Extjs6(六)——增删查改之查询
本文主要实现的效果是:点击查询按钮,根据form中的条件,在Grid中显示对应的数据(如果form为空,显示全部数据) 一.静态页面 1.查询按钮 { text:'查询', handler: 'onS ...
- [bzoj1895][Pku3580]supermemo_非旋转Treap
supermemo bzoj-1895 Pku-3580 题目大意:给定一个n个数的序列,需支持:区间加,区间翻转,区间平移,单点插入,单点删除,查询区间最小值. 注释:$1\le n\le 6.1\ ...