题意

题目链接

Sol

莫队板子题。。

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

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

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

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

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

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 1e6 + 10;
int mod;
template <typename A, typename B>
inline void mul2(A &x, B y) {
x = 1ll * x * y % mod;
}
template <typename A, typename B>
inline int mul(A x, B y) {
return 1ll * x * y % mod;
}
template <typename A, typename B>
inline int add(A x, B y) {
return x + y >= mod ? x + y - mod : x + y;
}
inline int read() {
char c = getchar();
int x = 0, f = 1;
while (c < '0' || c > '9') {
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, Q, belong[MAXN], block, l, r;
LL now, ans[MAXN];
char s[MAXN]; namespace Sub3 {
int pro[MAXN], num, date[MAXN], cnt[MAXN];
void Des() {
for (int i = 1; i <= N + 1; i++) date[++num] = pro[i];
sort(date + 1, date + num + 1);
num = unique(date + 1, date + num + 1) - date - 1;
for (int i = 1; i <= N + 1; i++) pro[i] = lower_bound(date + 1, date + num + 1, pro[i]) - date;
}
struct Query {
int l, r, id;
bool operator<(const Query &rhs) const {
return belong[l] == belong[rhs.l] ? r < rhs.r : belong[l] < belong[rhs.l];
}
} q[MAXN];
void Add(int x) {
now += cnt[x];
cnt[x]++;
}
void Delet(int x) {
cnt[x]--;
now -= cnt[x];
}
void solve() {
block = sqrt(N);
for (int i = 1; i <= N; i++) belong[i] = (i - 1) / block + 1;
for (int i = N, base = 1; i >= 1; i--, mul2(base, 10)) pro[i] = add(pro[i + 1], mul((s[i] - '0'), base));
Des();
Q = read();
for (int i = 1; i <= Q; i++) q[i].l = read(), q[i].r = read() + 1, q[i].id = i;
sort(q + 1, q + Q + 1);
l = 1, r = 0;
for (int i = 1; i <= Q; i++) {
while (r < q[i].r) Add(pro[++r]);
while (r > q[i].r) Delet(pro[r--]);
while (l < q[i].l) Delet(pro[l++]);
while (l > q[i].l) Add(pro[--l]);
ans[q[i].id] = now;
}
for (int i = 1; i <= Q; i++) cout << ans[i] << '\n';
}
} // namespace Sub3 namespace Sub1 {
int cnt[MAXN], a[MAXN];
struct Query {
int l, r, id;
bool operator<(const Query &rhs) const {
return belong[l] == belong[rhs.l] ? r < rhs.r : belong[l] < belong[rhs.l];
}
} q[MAXN];
void Add(int x, int opt) {
if (opt) {
if (x == 0)
now += r - l + 1;
} else {
now += cnt[0];
}
cnt[x]++;
}
void Delet(int x, int opt) {
cnt[x]--;
if (opt) {
if (x == 0)
now -= r - l + 1;
} else {
now -= cnt[0];
}
}
void solve() {
block = sqrt(N);
for (int i = 1; i <= N; i++) belong[i] = (i - 1) / block + 1, a[i] = (s[i] - '0') % 2;
Q = read();
for (int i = 1; i <= Q; i++) q[i].l = read(), q[i].r = read(), q[i].id = i;
sort(q + 1, q + Q + 1);
l = 1, r = 0;
for (int i = 1; i <= Q; i++) {
while (r < q[i].r) Add(a[++r], 1);
while (r > q[i].r) Delet(a[r--], 1);
while (l < q[i].l) Delet(a[l++], 0);
while (l > q[i].l) Add(a[--l], 0);
ans[q[i].id] = now;
}
for (int i = 1; i <= Q; i++) cout << ans[i] << '\n';
}
} namespace Sub2 {
int cnt[MAXN], a[MAXN], len[MAXN];
struct Query {
int l, r, id;
bool operator < (const Query &rhs) const {
return belong[l] == belong[rhs.l] ? r < rhs.r : belong[l] < belong[rhs.l];
}
}q[MAXN];
void Add(int x, int opt, int pos) {
cnt[x]++;
if(opt) {
if(x == 0 || x == 5) now += r - l + 1;
} else {
now += cnt[0] + cnt[5];
} }
void Delet(int x, int opt, int pos) {
if(opt) {
if(x == 0 || x == 5) now -= r - l + 1;
} else {
now -= cnt[0] + cnt[5];
}
cnt[x]--;
}
void solve() {
block = sqrt(N);
for(int i = 1; i <= N; i++) belong[i] = (i - 1) / block + 1, a[i] = s[i] - '0';
Q = read();
for(int i = 1; i <= Q; i++) q[i].l = read(), q[i].r = read(), q[i].id = i;
sort(q + 1, q + Q + 1);
l = 1, r = 0;
for(int i = 1; i <= Q; i++) {
while(l > q[i].l)
--l, Add(a[l], 0, l);
while(r > q[i].r)
Delet(a[r], 1, r), r--;
while(l < q[i].l)
Delet(a[l], 0, l), l++;
while(r < q[i].r)
++r, Add(a[r], 1, r);
ans[q[i].id] = now;
}
for(int i = 1; i <= Q; i++) cout << ans[i] << '\n';
} } int main() {
mod = read();
scanf("%s", s + 1);
N = strlen(s + 1);
if (mod == 2)
Sub1::solve();
else if (mod == 5)
Sub2::solve();
else
Sub3::solve();
return 0;
}
/*
11
1211
1
1 4
*/

洛谷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. feh: linux终端下看图片的好工具

    1) 普通浏览 $ feh * 可以察看当前目录下的所有图片,以及当前子目录里的所有图片 2) 播放幻灯片 (-D)   $ feh -D 2 *.jpg 对所有jpg以幻灯片的方式播放,每两秒放一张 ...

  2. Ubuntu 18.04基本配置

    允许WinSCP使用root连接 默认是不允许的,具体方法出自这里(传送门),修改ssh配置,在/etc/ssh下,修改sshd_config文件 PermitRootLogin yes 即可.默认不 ...

  3. yolo_v3训练自己的模型(人脸及deep-sort)

    做deep-sort多目标跟踪需要结合yolo_v3进行检测行人 由于我的项目中需要对人脸进行检测,所以需要训练针对人脸的模型 训练样本是来自WIDER-FACE人脸库.(有3w+的图片和标注框) d ...

  4. vsCode 设置vue 保存自动格式化代码

    setting { // vscode默认启用了根据文件类型自动设置tabsize的选项 "editor.detectIndentation": false, // 重新设定tab ...

  5. oracle 时间日期常用语句及函数

    记录常用时间函数以及处理时间的sql语句 (1)获得系统时间select sysdate from dual; (2)设置时间的格式select to_char(sysdate,'yyyy/MM/dd ...

  6. 源码安装ELK-5.6.10版本

    目录: 一.介绍 二.安装JDK 三.安装Elasticsearch 四.安装Kibana 五.安装Nginx 六.安装Logstash 七.安装Logstash-forwarder 八.测试 系统环 ...

  7. 课程回顾-Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization

    训练.验证.测试划分的量要保证数据来自一个分布偏差方差分析如果存在high bias如果存在high variance正则化正则化减少过拟合的intuitionDropoutdropout分析其它正则 ...

  8. spring-boot-maven-plugin插件的作用

    要记住:spring-boot-maven-plugin插件在打Jar包时会引入依赖包 可以打成直接运行的Jar包 maven项目的pom.xml中,添加了org.springframework.bo ...

  9. Java 容器 & 泛型:一、认识容器

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 容器是Java语言学习中重要的一部分.泥瓦匠我的感觉是刚开始挺难学的,但等你熟悉它,接触多了,也就“顺 ...

  10. iOS逆向开发(3):锁定APP的目标类与函数 | reveal | lldb | debugserver | 远程调试

    之前介绍了怎么获取APP的所有类的结构信息,这个有什么用呢?用处大了,比如以这一步为基础,下一步通过注入来做更多研究工作. 注入的最小单位是函数,实际上,编译执行的程序在编译后,类就不复存在了,留下来 ...