洛谷P3245 [HNOI2016]大数(莫队)
题意
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]大数(莫队)的更多相关文章
- 洛谷P3245 [HNOI2016]大数 【莫队】
题目 题解 除了\(5\)和\(2\) 后缀数字对\(P\)取模意义下,两个位置相减如果为\(0\),那么对应子串即为\(P\)的倍数 只用对区间种相同数个数\(x\)贡献\({x \choose 2 ...
- 洛谷P3246 [HNOI2016]序列 [莫队]
传送门 思路 看到可离线.无修改.区间询问,相信一定可以想到莫队. 然而,莫队怎么转移是个大问题. 考虑\([l,r]\rightarrow[l,r+1]\)时答案会怎样变化?(左端点变化时同理) \ ...
- BZOJ.4542.[HNOI2016]大数(莫队)
题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...
- bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)
题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...
- 【BZOJ4542】[Hnoi2016]大数 莫队
[BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...
- 洛谷 P4396 (离散化+莫队+树状数组)
### 洛谷P4396 题目链接 ### 题目大意: 有 n 个整数组成的数组,m 次询问,每次询问中有四个参数 l ,r,a,b .问你在[l,r] 的区间内的所有数中,值属于[a,b] 的数的个 ...
- [BZOJ4542] [Hnoi2016] 大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 洛谷P4396 作业 [AHOI2013] 莫队
正解:莫队 解题报告: 传送门! 天呐太久没做莫队了连板子都认不出来了,,,所以复健下做下莫队的题目QAQ 就很板子鸭,和莫队板子比好像只有一个离散化,,,?就不讲了QAQ 等下直接放代码QAQ ov ...
- 洛谷 P2056 采花 - 莫队算法
萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成一排的,以 ...
随机推荐
- java,让debug出色
虽然我们不喜欢bug,但是bug永远都存在.虽然我们牛逼,但是仍然有不知道的东西,解决不了的问题.so,还得借助工具,让咱效率提起来扛扛的.解决的问题如是:由于某种原因,其他系统发送的mq,我这边说没 ...
- gdb调试的layout使用
layout:用于分割窗口,可以一边查看代码,一边测试.主要有以下几种用法:layout src:显示源代码窗口layout asm:显示汇编窗口layout regs:显示源代码/汇编和寄存器窗口l ...
- compose函数
compose函数 在学习redux源码的时候看到了其中的工具函数compose,compose函数的作用就是组合函数,依次组合传入的函数: 后一个函数作为前一个函数的参数 最后一个函数可以接受多个参 ...
- js自定义水印
前言:今天在github上看到了一个定义水印的项目,因为获取的星星还蛮多,就多看了几眼,发现该项目简单有趣,心想以后可能会用的到,并且我下载到本地并亲自测试运行了一波.其实该项目最吸引我的是它定义js ...
- 将本地代码上传到github走过的坑
1.因为github是服务端,需要自己在自己的电脑上安装一个客户端git 2.配置SSH(配置一次就好了) github是不能随便上传代码上去的,而是通过一种网络协议---SSH授权的.SSH是一种网 ...
- [P5162] WD与积木
每种堆法(理解成名次序列,举例3,3,8,2和7,7,100,2都对应2,2,1,3这个名次序列)等概率出现:题目中"两种堆法不同当且仅当某个积木在两种堆法中处于不同的层中"可见这 ...
- mysql 开发进阶篇系列 8 锁问题 (共享锁与排它锁演示)
1 .innodb 共享锁(lock in share mode)演示 会话1 会话2 SET autocommit=0; SELECT cityname FROM city WHERE city_ ...
- 全网最详细的最新稳定OSSEC搭建部署(ossec-server(CentOS7.X)和ossec-agent(CentOS7.X))(图文详解)
不多说,直接上干货! 前言 写在前面的话,网上能够找到一些关于ossec方面的资料,虽然很少,但是总比没有强,不过在实际的使用过程中还是会碰到许多稀奇古怪的问题.整理整理我的使用过程,就当做一篇笔记吧 ...
- 03 使用Tensorflow做计算题
我们使用Tensorflow,计算((a+b)*c)^2/a,然后求平方根.看代码: import tensorflow as tf # 输入储存容器 a = tf.placeholder(tf.fl ...
- zabbix-proxy使用配置
简介 zabbix proxy可以代替zabbix server检索客户端的数据,然后把数据汇报给zabbix server,并且在一定程度上分担了zabbix server的压力.zabbix pr ...