题意

题目链接

Sol

莫队板子题。。

维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\)

两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S_l = S_r\)

离散化之后直接上莫队就行了

对\(2, 5\)特判一下,因为2/5是10的因子,可能导致答案变大。直接维护\(0/5\)的出现次数就可以了

考场上一高兴写了三个Subtask。。

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. using namespace std;
  4. const int MAXN = 1e6 + 10;
  5. int mod;
  6. template <typename A, typename B>
  7. inline void mul2(A &x, B y) {
  8. x = 1ll * x * y % mod;
  9. }
  10. template <typename A, typename B>
  11. inline int mul(A x, B y) {
  12. return 1ll * x * y % mod;
  13. }
  14. template <typename A, typename B>
  15. inline int add(A x, B y) {
  16. return x + y >= mod ? x + y - mod : x + y;
  17. }
  18. inline int read() {
  19. char c = getchar();
  20. int x = 0, f = 1;
  21. while (c < '0' || c > '9') {
  22. if (c == '-')
  23. f = -1;
  24. c = getchar();
  25. }
  26. while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  27. return x * f;
  28. }
  29. int N, Q, belong[MAXN], block, l, r;
  30. LL now, ans[MAXN];
  31. char s[MAXN];
  32. namespace Sub3 {
  33. int pro[MAXN], num, date[MAXN], cnt[MAXN];
  34. void Des() {
  35. for (int i = 1; i <= N + 1; i++) date[++num] = pro[i];
  36. sort(date + 1, date + num + 1);
  37. num = unique(date + 1, date + num + 1) - date - 1;
  38. for (int i = 1; i <= N + 1; i++) pro[i] = lower_bound(date + 1, date + num + 1, pro[i]) - date;
  39. }
  40. struct Query {
  41. int l, r, id;
  42. bool operator<(const Query &rhs) const {
  43. return belong[l] == belong[rhs.l] ? r < rhs.r : belong[l] < belong[rhs.l];
  44. }
  45. } q[MAXN];
  46. void Add(int x) {
  47. now += cnt[x];
  48. cnt[x]++;
  49. }
  50. void Delet(int x) {
  51. cnt[x]--;
  52. now -= cnt[x];
  53. }
  54. void solve() {
  55. block = sqrt(N);
  56. for (int i = 1; i <= N; i++) belong[i] = (i - 1) / block + 1;
  57. for (int i = N, base = 1; i >= 1; i--, mul2(base, 10)) pro[i] = add(pro[i + 1], mul((s[i] - '0'), base));
  58. Des();
  59. Q = read();
  60. for (int i = 1; i <= Q; i++) q[i].l = read(), q[i].r = read() + 1, q[i].id = i;
  61. sort(q + 1, q + Q + 1);
  62. l = 1, r = 0;
  63. for (int i = 1; i <= Q; i++) {
  64. while (r < q[i].r) Add(pro[++r]);
  65. while (r > q[i].r) Delet(pro[r--]);
  66. while (l < q[i].l) Delet(pro[l++]);
  67. while (l > q[i].l) Add(pro[--l]);
  68. ans[q[i].id] = now;
  69. }
  70. for (int i = 1; i <= Q; i++) cout << ans[i] << '\n';
  71. }
  72. } // namespace Sub3
  73. namespace Sub1 {
  74. int cnt[MAXN], a[MAXN];
  75. struct Query {
  76. int l, r, id;
  77. bool operator<(const Query &rhs) const {
  78. return belong[l] == belong[rhs.l] ? r < rhs.r : belong[l] < belong[rhs.l];
  79. }
  80. } q[MAXN];
  81. void Add(int x, int opt) {
  82. if (opt) {
  83. if (x == 0)
  84. now += r - l + 1;
  85. } else {
  86. now += cnt[0];
  87. }
  88. cnt[x]++;
  89. }
  90. void Delet(int x, int opt) {
  91. cnt[x]--;
  92. if (opt) {
  93. if (x == 0)
  94. now -= r - l + 1;
  95. } else {
  96. now -= cnt[0];
  97. }
  98. }
  99. void solve() {
  100. block = sqrt(N);
  101. for (int i = 1; i <= N; i++) belong[i] = (i - 1) / block + 1, a[i] = (s[i] - '0') % 2;
  102. Q = read();
  103. for (int i = 1; i <= Q; i++) q[i].l = read(), q[i].r = read(), q[i].id = i;
  104. sort(q + 1, q + Q + 1);
  105. l = 1, r = 0;
  106. for (int i = 1; i <= Q; i++) {
  107. while (r < q[i].r) Add(a[++r], 1);
  108. while (r > q[i].r) Delet(a[r--], 1);
  109. while (l < q[i].l) Delet(a[l++], 0);
  110. while (l > q[i].l) Add(a[--l], 0);
  111. ans[q[i].id] = now;
  112. }
  113. for (int i = 1; i <= Q; i++) cout << ans[i] << '\n';
  114. }
  115. }
  116. namespace Sub2 {
  117. int cnt[MAXN], a[MAXN], len[MAXN];
  118. struct Query {
  119. int l, r, id;
  120. bool operator < (const Query &rhs) const {
  121. return belong[l] == belong[rhs.l] ? r < rhs.r : belong[l] < belong[rhs.l];
  122. }
  123. }q[MAXN];
  124. void Add(int x, int opt, int pos) {
  125. cnt[x]++;
  126. if(opt) {
  127. if(x == 0 || x == 5) now += r - l + 1;
  128. } else {
  129. now += cnt[0] + cnt[5];
  130. }
  131. }
  132. void Delet(int x, int opt, int pos) {
  133. if(opt) {
  134. if(x == 0 || x == 5) now -= r - l + 1;
  135. } else {
  136. now -= cnt[0] + cnt[5];
  137. }
  138. cnt[x]--;
  139. }
  140. void solve() {
  141. block = sqrt(N);
  142. for(int i = 1; i <= N; i++) belong[i] = (i - 1) / block + 1, a[i] = s[i] - '0';
  143. Q = read();
  144. for(int i = 1; i <= Q; i++) q[i].l = read(), q[i].r = read(), q[i].id = i;
  145. sort(q + 1, q + Q + 1);
  146. l = 1, r = 0;
  147. for(int i = 1; i <= Q; i++) {
  148. while(l > q[i].l)
  149. --l, Add(a[l], 0, l);
  150. while(r > q[i].r)
  151. Delet(a[r], 1, r), r--;
  152. while(l < q[i].l)
  153. Delet(a[l], 0, l), l++;
  154. while(r < q[i].r)
  155. ++r, Add(a[r], 1, r);
  156. ans[q[i].id] = now;
  157. }
  158. for(int i = 1; i <= Q; i++) cout << ans[i] << '\n';
  159. }
  160. }
  161. int main() {
  162. mod = read();
  163. scanf("%s", s + 1);
  164. N = strlen(s + 1);
  165. if (mod == 2)
  166. Sub1::solve();
  167. else if (mod == 5)
  168. Sub2::solve();
  169. else
  170. Sub3::solve();
  171. return 0;
  172. }
  173. /*
  174. 11
  175. 1211
  176. 1
  177. 1 4
  178. */

洛谷P3245 [HNOI2016]大数(莫队)的更多相关文章

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

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

  2. 洛谷P3246 [HNOI2016]序列 [莫队]

    传送门 思路 看到可离线.无修改.区间询问,相信一定可以想到莫队. 然而,莫队怎么转移是个大问题. 考虑\([l,r]\rightarrow[l,r+1]\)时答案会怎样变化?(左端点变化时同理) \ ...

  3. BZOJ.4542.[HNOI2016]大数(莫队)

    题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...

  4. bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)

    题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...

  5. 【BZOJ4542】[Hnoi2016]大数 莫队

    [BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...

  6. 洛谷 P4396 (离散化+莫队+树状数组)

    ### 洛谷P4396  题目链接 ### 题目大意: 有 n 个整数组成的数组,m 次询问,每次询问中有四个参数 l ,r,a,b .问你在[l,r] 的区间内的所有数中,值属于[a,b] 的数的个 ...

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

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

  8. 洛谷P4396 作业 [AHOI2013] 莫队

    正解:莫队 解题报告: 传送门! 天呐太久没做莫队了连板子都认不出来了,,,所以复健下做下莫队的题目QAQ 就很板子鸭,和莫队板子比好像只有一个离散化,,,?就不讲了QAQ 等下直接放代码QAQ ov ...

  9. 洛谷 P2056 采花 - 莫队算法

    萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成一排的,以 ...

随机推荐

  1. Node.js(day2)

    一.使用Node实现基本Apache的功能 在上一篇笔记中,我们提到如果打开一个文件需要进行一次url判断是繁琐的,我们希望我们的Node具有类似Apache这种web服务器的一个功能:将文件放到ww ...

  2. [Postman]生成代码段(17)

    在Postman中完成并保存您的请求后,您可能希望从您自己的应用程序发出相同的请求.Postman允许您生成各种语言和框架的代码片段,以帮助您实现此目的.您需要单击蓝色发送按钮下的**代码**链接以打 ...

  3. css3新特性总结

    一.什么是css3 css用于控制网页的样式和布局,css3是css的升级版本,受浏览器限制,跨浏览器开发有点复杂.css3完全向后兼容 二.css3新特性 1.边框 css3的边框有如下属性: (1 ...

  4. SHOW INDEX 你用过吗???

    mysql中 show 包含了很多指令,例如show table status, show innodb 等等等, 今天来讲讲mysql中SHOW  INDEX FROM tableName 本例中用 ...

  5. 求一个Map中最大的value值,同时列出键,值

    求一个Map中最大的value值,同时列出键,值 方法1. public static void main(String[] args){  Map map=new HashMap();  map.p ...

  6. Apache-Flink深度解析-TableAPI

    您可能感兴趣的文章合集: Flink入门 Flink DataSet&DataSteam API Flink集群部署 Flink重启策略 Flink分布式缓存 Flink重启策略 Flink中 ...

  7. mysql常用字符串操作函数大全,以及实例

    今天在论坛中看到一个关于mysql的问题,问题如下 good_id     cat_id12654         665,56912655         601,4722 goods_id是商品i ...

  8. [PKUWC2018] 随机游走

    Description 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 ...

  9. man statd(rpc.statd中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html rpc.statd程序主要实现NFS锁相关内容,如普通的文件锁(NLM.NSM).文件 ...

  10. Java编译与反编译

    Javac是一种编译器,它的作用是将符合Java语言规范的源代码转化成符合Java虚拟机规范的Java字节码. 一.编译过程 词法分析:找出源代码中的所有关键字,生成Token流 语法分析:检查Tok ...