[BZOJ4542] [Hnoi2016] 大数 (莫队)
Description
小 B 有一个很大的数 S,长度达到了 N 位;这个数可以看成是一个串,它可能有前导 0,例如00009312345
。小B还有一个素数P。现在,小 B 提出了 M 个询问,每个询问求 S 的一个子串中有多少子串是 P 的倍数(0 也
是P 的倍数)。例如 S为0077时,其子串 007有6个子串:0,0,7,00,07,007;显然0077的子串007有6个子串都是素
数7的倍数。
Input
第一行一个整数:P。第二行一个串:S。第三行一个整数:M。接下来M行,每行两个整数 fr,to,表示对S 的
子串S[fr…to]的一次询问。注意:S的最左端的数字的位置序号为 1;例如S为213567,则S[1]为 2,S[1…3]为 2
13。N,M<=100000,P为素数
Output
输出M行,每行一个整数,第 i行是第 i个询问的答案。
Sample Input
121121
3
1 6
1 5
1 4
Sample Output
3
2
//第一个询问问的是整个串,满足条件的子串分别有:121121,2112,11,121,121。
HINT
Source
2016.4.19新加数据一组
Solution
把n个后缀组成的数字全部对p取模。
若s[l] ~ s[n]的余数和s[r] ~ s[n]的余数相同,那么s[l] ~ s[r - 1]区间内的数字就是p的倍数(l < r)
这里有例外:当p = 2或p = 5时不成立。
然后这个题就变成经典莫队题了:给定一个序列,每次询问[l, r]内有多少对相同的数
每一个余数i给一个计数器ba[i](需离散化),记录[l, r]中这个数出现了几次,区间长度±1时答案改变值为ba[i]。
然后。。。原数据里没有p = 2或p = 5的情况。。。所以就没有然后了。然而BZOJ加了组数据
p = 2或p = 5时,用两个数组分别表示[1, i]中2或5的倍数时有多少种情况及有多少个数末尾是2或5的倍数,用前缀和维护。这部分就很简单了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll sqn, lst[], cd[], ba[], ans[];
struct query
{
ll id, l, r;
bool operator < (const query &rhs) const
{
if(l / sqn == rhs.l / sqn) return r < rhs.r;
return l / sqn < rhs.l / sqn;
}
}q[];
char s[];
map<ll, ll> Map;
int main()
{
ll n, m, p, l = , r = , cur = , bt = ;
scanf("%lld%s%lld", &p, s + , &m);
n = strlen(s + ), sqn = (ll)sqrt(n * 1.0);
if(p != && p != )
{
for(ll i = n; i; i--)
{
bt = bt * % p;
lst[i] = (lst[i + ] + (s[i] - ) * bt) % p;
cd[i] = lst[i];
}
sort(cd + , cd + n + );
for(ll i = ; i <= n + ; i++)
Map[cd[i]] = i;
for(ll i = ; i <= n + ; i++)
lst[i] = Map[lst[i]];
for(ll i = ; i <= m; i++)
{
scanf("%lld%lld", &q[i].l, &q[i].r);
q[i].id = i, q[i].r++;
}
sort(q + , q + m + );
for(ll i = ; i <= m; i++)
{
while(r < q[i].r) cur += ba[lst[++r]]++;
while(l > q[i].l) cur += ba[lst[--l]]++;
while(l < q[i].l) cur -= --ba[lst[l++]];
while(r > q[i].r) cur -= --ba[lst[r--]];
ans[q[i].id] = cur;
}
for(ll i = ; i <= m; i++)
printf("%lld\n", ans[i]);
}
else
{
for(ll i = ; i <= n; i++)
if(!((s[i] - ) % p))
ba[i] = ba[i - ] + , cd[i] = cd[i - ] + i;
else
ba[i] = ba[i - ], cd[i] = cd[i - ];
for(ll i = ; i <= m; i++)
{
scanf("%lld%lld", &l, &r);
printf("%lld\n", cd[r] - cd[l - ] - (ba[r] - ba[l - ]) * (l - ));
}
}
return ;
}
[BZOJ4542] [Hnoi2016] 大数 (莫队)的更多相关文章
- 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还有一个 ...
- 【bzoj4542】[Hnoi2016]大数 莫队算法
题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...
- BZOJ.4542.[HNOI2016]大数(莫队)
题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...
- 洛谷P3245 [HNOI2016]大数(莫队)
题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...
- [BZOJ4542] [JZYZOJ2014][Hnoi2016] 大数(莫队+离散化)
正经题解在最下面 http://blog.csdn.net/qq_32739495/article/details/51286548 写的时候看了大神的题解[就是上面那个网址],看到下面这段话 观察题 ...
- bzoj 4542: [Hnoi2016]大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- [HNOI2016]序列(莫队,RMQ)
[HNOI2016]序列(莫队,RMQ) 洛谷 bzoj 一眼看不出来怎么用数据结构维护 然后还没修改 所以考虑莫队 以$(l,r-1) -> (l,r)$为例 对答案的贡献是$\Sigma_ ...
- 【莫队】bzoj4542: [Hnoi2016]大数
挺有意思的,可以仔细体味一下的题:看白了就是莫队板子. Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小 ...
随机推荐
- [Swift]UIKit学习之警告框:UIAlertController和UIAlertView
Important: UIAlertView is deprecated in iOS 8. (Note that UIAlertViewDelegate is also deprecated.) T ...
- Ubuntu系统下crontab的使用
最近一个项目,需要用到一个定时任务,先说crontab的常用命令. crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 crontab -l //列出 ...
- CSS中可以继承和不可继承的常见属性
一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性: vertical-align:垂直文本对齐 text-decoration:规定添加到文本的装饰 text-shad ...
- XAMPP环境访问非Web DocumentRoot下绝对路径
假设你的XAMPP网站文档根目录在C:/xampp/apache/htdocs/下面,那么访问这个目录下的文件是很直接的. 但是有时候需要把用户上传文件指定到特殊目录,比如E盘,那么就需要用户能够访问 ...
- python爬虫循环导入MySql数据库
1.开发环境 操作系统:win10 Python 版本:Python 3.5.2 MySQL:5.5.53 2.用到的模块 没有的话使用pip进行安装:pip install xxx ...
- Java经典编程题50道之三十一
将一个数组逆序输出. public class Example31 { public static void main(String[] args) { int[] a = { 9 ...
- npm注意事项(附带Vue-cli安装)
下载完nodeJS后,可选择更改配置目录 1.npm config set prefix "D:\node\node-global"<!--配置全局安装目录--> 2. ...
- 使用lambda编程之延迟执行
使用lambda表达式的主要原因是,将代码的执行延迟到一个合适的时间点. 所有的lambda表达式都是延迟执行的.毕竟,如果你希望立即执行一段代码,那就没有必要使用lambda表达式了.延迟执行代码的 ...
- 浅谈JavaScript位操作符
因为ECMAscript中所有数值都是以IEEE-75464格式存储,所以才会诞生了位操作符的概念. 位操作符作用于最基本的层次上,因为数值按位存储,所以位操作符的作用也就是操作数值的位.不过位操作符 ...
- Phpstrom操作Git从服务器端克隆代码到本地
1.第一步点开Git 2.添加项目的路径 第一个框是你所在的项目路径,后缀名是.git,这里我用的是HTTPS的方式(还有一种是SSH) 第二是你要克隆到所在目录,我的是在Apache下面的htdoc ...