【BZOJ】4542: [Hnoi2016]大数
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4542
给定一个由数字构成的字符串${S_{1,2,3,...,n}}$,一个正素数$P$,每次询问给定一对$l$,$r$求:
$${\sum_{l=1}^{n}\sum_{r=i}^{n}\left [ \sum _{i=l}^{r}S[i]*10^{r-i} \,\,\,\,MOD\,\,\,\,P=0 \right ]}$$
即以位置$x$开头的后缀的数字$%P$之后的值为$val[x]$,如果一个数字对应区间${[l,r]}$它$%p$为$0$的充要条件为${val[l]=val[r-1]}$,然后套上莫队算法,离散化$val$数组,就变成了经典的查询一个区间相同数字的点对有多少个。
注意:$p=2,5$的情况中并不满足以上性质,记一下前缀和然后特判即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 300100
#define llg long long
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,p,quan[maxn],tail,val[maxn],len,se[maxn],KUAI;
long long ans,Ans[maxn],jisuan1[maxn],jisuan2[maxn];
char s[maxn];
struct Q_
{
llg l,r,num;
}ask[maxn]; bool cmp(const Q_&a,const Q_&b) {if (a.l/KUAI==b.l/KUAI) return a.r<b.r; else return a.l/KUAI<b.l/KUAI; } llg find(llg x)
{
llg l=,r=len,wz=-,mid;
while (l<=r)
{
mid=(l+r)>>;
if (quan[mid]<=x) {wz=mid; l=mid+;}else {r=mid-;}
}
return wz;
} void solve()
{
cin>>m;
for(int i=;i<=n;i++)
{
jisuan1[i]=jisuan1[i-]; jisuan2[i]=jisuan2[i-];
if( (s[i]-'')%p== )
{
jisuan1[i]++;
jisuan2[i]+=i;
} }
for(int i=;i<=m;i++)
{
llg x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",jisuan2[y]-jisuan2[x-] - (x-)*(jisuan1[y]-jisuan1[x-]));
}
} void init()
{
cin>>p;
scanf("%s",s+);
n=strlen(s+);
KUAI=sqrt(n)+;
if (p== || p==) return ;
cin>>m;
for (llg i=;i<=m;i++) scanf("%lld%lld",&ask[i].l,&ask[i].r),ask[i].r++,ask[i].num=i;
sort(ask+,ask+m+,cmp);
llg C=;
tail=;quan[]=;
for (llg i=n;i>=;i--)
{
val[i]=val[i+]+C*(s[i]-'');
val[i]%=p;
quan[++tail]=val[i];
C*=; C%=p;
}
sort(quan+,quan+tail+);
len=unique(quan+,quan+tail+)-(quan+);
for (llg i=;i<=n+;i++) val[i]=find(val[i]);
} int main()
{
yyj("number");
init();
if (p== || p==) {solve(); return ;} llg l=ask[].l,r=ask[].r;
for (llg i=l;i<=r;i++)
{
ans+=se[val[i]];
se[val[i]]++;
}
Ans[ask[].num]=ans;
for (llg k=;k<=m;k++)
{
llg nl=ask[k].l,nr=ask[k].r;
if (nr>r)
{
for (llg i=r+;i<=nr;i++)
{
ans+=se[val[i]];
se[val[i]]++;
}
}
if (nr<r)
{
for (llg i=r;i>nr;i--)
{
ans-=se[val[i]]-;
se[val[i]]--;
}
}
if (l<nl)
{
for (llg i=l;i<nl;i++)
{
ans-=se[val[i]]-;
se[val[i]]--;
}
}
if (l>nl)
{
for (llg i=l-;i>=nl;i--)
{
ans+=se[val[i]];
se[val[i]]++;
}
}
Ans[ask[k].num]=ans;
l=nl,r=nr;
}
for (llg i=;i<=m;i++) printf("%lld\n",Ans[i]);
return ;
}
【BZOJ】4542: [Hnoi2016]大数的更多相关文章
- BZOJ.4542.[HNOI2016]大数(莫队)
题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...
- bzoj 4542 [Hnoi2016]大数 (坑)
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4542 题解 Code #include<bits/stdc++.h> using ...
- bzoj 4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345 小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- bzoj 4542: [Hnoi2016]大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 4542: [Hnoi2016]大数
4542: [Hnoi2016]大数 链接 分析: 如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可. 如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\f ...
- 4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 【LG3245】[HNOI2016]大数
[LG3245][HNOI2016]大数 题面 洛谷 题解 60pts 拿vector记一下对于以每个位置为右端点符合要求子串的左端点, 则每次对于一个询问,扫一遍右端点在vector里面二分即可, ...
- BZOJ 3110 K大数查询 | 整体二分
BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...
- 【BZOJ4542】[Hnoi2016]大数 莫队
[BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...
随机推荐
- 使用github管理Eclipse分布式项目开发
使用github管理Eclipse分布式项目开发 老关我在前面的博文(github管理iOS分布式项目开发)中介绍了github管理iOS分布式开发,今天老关将向大家介绍使用github管 理Ecli ...
- Spring/SpringMVC/MyBatis(持久层、业务层、控制层思路小结)
准备工作: ## 7 导入省市区数据到数据库中 1. 从FTP下载SQL脚本文件 2. 把脚本文件移动到易于描述绝对路径的位置 3. 进入MySQL控制台 4. 使用`xxx_xxx`数据库 5. 运 ...
- centos 7上nginx+uwsgi 性能调优
上一章将nginx +uwsgi搭建起来,将keystone挂载后面.但是发现一个问题,如果http请求达到一定量后,nginx直接返回502.这让需要部署大规模openstack集群的我很是头疼,比 ...
- powermock+mockito+testng 单元测试pom文件
0:Supported versions PowerMock version 1.7.0 and upper has experimental support of Mockito 2. A lot ...
- ora-12705解决方法
最近使用instant sqlplus测试时,遇到ora-12705,一开始以为是少了配置,经查是,NLS_LANG设置问题,设置为"SIMPLIFIED CHINESE_CHINA.ZHS ...
- suse日常操作(含suse/rhel内核与发行版对应关系)
最近有家客户要求只能使用suse系统,是suse 12 sp3的,而且版本都不同意换,一直以来,都是使用rhel的客户,还没遇到过suse的,可偏偏不巧,我们的系统和suse 12 sp3自带的gli ...
- 14: element ui 使用
1.1 element ui 基本使用 参考网址: http://element.eleme.io/#/zh-CN/component/button 1.初始一个vue项目并安装element ui ...
- 线性回归、Logistic回归、Softmax回归
线性回归(Linear Regression) 什么是回归? 给定一些数据,{(x1,y1),(x2,y2)…(xn,yn) },x的值来预测y的值,通常地,y的值是连续的就是回归问题,y的值是离散的 ...
- 0x17二叉堆之超市
题目链接:https://www.acwing.com/problem/content/147/ 容易想到一个贪心策略:在最优解中,对于每个时间(天数) t,应该在保证不卖出过期商品的前提下,尽量卖出 ...
- topcoder srm 663 div1
problem1 link 每次枚举$S$的两种变化,并判断新的串是否是$T$的子串.不是的话停止搜索. problem2 link 首先考慮增加1个面值为1的硬币后,$ways$数组有什么变化.设原 ...