HN一天考两个莫队是什么鬼..或者说莫队不是正确的姿势..?
考虑已经知道了 l..r l..r的答案新添入 r+1 r+1如何更新当前答案
需要先预处理出后缀 modp mod p的值 bi b_i,假设子序列 l..r l..r模 p p的值为xx
那么 x∗10r−l+b[r]=b[l] x*10^{r-l}+b[r]=b[l] 然后就可以直接莫队统计了
模数为2或5的时候要特判一下

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<ctime>
#include<set>
#include<map>
#define N 110000
#define ll long long
using namespace std;
struct W{int l,r,p;}q[N];
char s[N];
long long sum[N],mod,ss[N],ans[N];
long long a[N],b[N],c[N],h[N],now;
int bl[N],cnt[N];
int n,m,Q,tot,block;
void solve_2_5()
{for(int i=1;i<=n;i++){ss[i]=ss[i-1];sum[i]=sum[i-1];if((s[i]-'0')%mod==0) sum[i]+=i,ss[i]++;}scanf("%d",&Q);for(int i=1;i<=Q;i++){int l,r;scanf("%d%d",&l,&r);printf("%lld\n",sum[r]-sum[l-1]-(ss[r]-ss[l-1])*(l-1));}
}
bool cmp(int x,int y)
{return b[x]<b[y];
}
bool cmp1(W a,W b)
{return bl[a.l]<bl[b.l]||(bl[a.l]==bl[b.l]&&a.r<b.r);
}
int main()
{scanf("%lld%s",&mod,s+1);n=strlen(s+1); block=sqrt(n);if(mod==2||mod==5){solve_2_5();return 0;}a[0]=1;for(int i=1;i<=n;i++) a[i]=10*a[i-1]%mod;for(int i=n;i>=1;i--) b[i]=(a[n-i]*(s[i]-'0')+b[i+1])%mod;for(int i=1;i<=n;i++) c[i]=i;sort(c+1,c+n+1,cmp);for(int i=1;i<=n;i++)if(b[c[i]]==b[c[i-1]]) h[c[i]]=tot;else h[c[i]]=++tot;for(int i=1;i<=n;i++) bl[i]=(i-1)/block;scanf("%d",&Q);for(int i=1;i<=Q;i++)scanf("%d%d",&q[i].l,&q[i].r),q[i].p=i;sort(q+1,q+Q+1,cmp1);int L=1,R=0;for(int i=1;i<=Q;i++){while(L>q[i].l) now+=cnt[h[L-1]]+(h[R+1]==h[L-1]),cnt[h[--L]]++;while(R<q[i].r) cnt[h[++R]]++,now+=cnt[h[R+1]];while(L<q[i].l) cnt[h[L]]--,now-=cnt[h[L]]+(h[R+1]==h[L]),L++;while(R>q[i].r) now-=cnt[h[R+1]],cnt[h[R--]]--;ans[q[i].p]=now;}for(int i=1;i<=Q;i++) printf("%lld\n",ans[i]);return 0;
}

4542: [Hnoi2016]大数|莫队相关推荐

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

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

  2. 洛谷 - P3246 [HNOI2016]序列(莫队+单调栈)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问需要回答一个区间 [l,r][l,r][l,r] 内所有子区间的最小值之和 题目分析:因为可以离线,所以考 ...

  3. P3246 [HNOI2016]序列 莫队 + ST表 + 单调栈

    传送门 文章目录 题意: 思路: Update 题意: 思路: 比较神奇的一个题,这里先介绍莫队的离线解法. 不难发现,用莫队来做最大的难点就是在进行区间移动的时候如何快速计算贡献. 比如[l,r]− ...

  4. 【bzoj5452】[Hnoi2016]大数(莫队)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4542 首先若p=2,5则这题就是道傻逼题,前缀和搞一下没了.如果p为其他质数,那么可以 ...

  5. 洛谷P3245 [HNOI2016]大数 【莫队】

    题目 题解 除了\(5\)和\(2\) 后缀数字对\(P\)取模意义下,两个位置相减如果为\(0\),那么对应子串即为\(P\)的倍数 只用对区间种相同数个数\(x\)贡献\({x \choose 2 ...

  6. [HNOI2016] 大数(莫队)

    problem luogu-P3245 solution 将这个 nnn 位数从右往左的记录取模 ppp 的结果,即 f(i)=(f(i−1)∗10+si)%pf(i)=(f(i-1)*10+s_i) ...

  7. P3246 [HNOI2016]序列(莫队+单调栈+ST表)

    [HNOI2016]序列 Tea神题解 Kelin神题解 对于莫队算法最主要的是如何快速算出[l,r]→[l,r+1][l,r]\to[l,r+1][l,r]→[l,r+1]对答案的贡献的变化. 当询 ...

  8. [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)

    4540: [Hnoi2016]序列 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1567  Solved: 718 [Submit][Statu ...

  9. 【HNOI2016】序列【莫队】【单调栈】【ST表】

    题意:给定序列 aia_iai​,qqq 次询问 [l,r][l,r][l,r] 所有子区间最小值之和. n,q≤105n,q\leq 10^5n,q≤105 这种题一眼看上去是离线线段树,但这题每移 ...

最新文章

  1. git pull出现There is no tracking information for the current branch
  2. 使用阿里云的maven私服的setting.xml, 提高maven项目jar下载速度
  3. 【Android开发】图形图像处理技术-绘制几何图形
  4. SpringBoot 项目打包部署
  5. SQL游标使用方法SQL游标使用方法(转)
  6. Ubunt更换阿里云镜像源
  7. SOA系列文章之(四):在Web服务中使用SOA
  8. JavaScript循环数组
  9. android随机抽奖代码_Android自己定义效果——随机抽奖
  10. 怎样解题:写题解思考问题的原则
  11. 手机模拟器安装证书抓包
  12. 手机开发APP整体界面设计工具之墨刀---没用过就知道它很牛掰
  13. Segmentation Fault原因总结
  14. STM32开发 | AD7606并行多路采集数据
  15. iOS开发 DarkMode 暗黑模式
  16. postgres用户管理及权限控制--赋予某账号只读权限
  17. Html5代码实现动态时钟
  18. 为 a.out 举行一个特殊的告别仪式
  19. 一款免费的屏幕录制软件
  20. 5秒钟用google earth engine(GEE)填补Landsat7条带问题

热门文章

  1. 关于Java面向对象程序设计原则之一——开闭原则的思考与分享
  2. 深度学习——Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
  3. docker安装中文版gitlab
  4. Java生成条形码code128
  5. 【软件测试】分享一波测试面试题(偏银行、信贷)。
  6. 计算机毕业设计Java自行车租借管理系统(源码+系统+mysql数据库+Lw文档)
  7. 华为手机备忘录闹钟铃声怎么设置?
  8. 学长们的求职血泪史(C/C++/JAVA) 努力吧骚年们
  9. C语言零基础项目:迷宫游戏!详细思路+源码分享
  10. Tiny6410开机logo制作