洛谷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 表示) ,且花是排成一排的,以 ...
随机推荐
- 原生Ajax GET+POST请求无刷新实现文本框用户名是否被注册
实现Ajax需要使用一个核心对象XMLHttpRequest XMLHttpRequest对象可以在不向服务器提交整个页面的情况下,实现局部更新网页.当页面全部加载完毕后,客户端通过该对象向服务器请求 ...
- PHP之ThinkPHP框架(界面)
Thinkphp框架其精髓就在于实现了MVC思想,其中M为模板.V为视图.C为控制器,模板一般是公共使用类,在涉及数据库时,一般会跟数据表同名,视图会和控制器类里的方法进行名字的一一对应. 下载及配置 ...
- asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案
之前碰到asp.net core异步进行新增操作并且需要判断某些字段是否重复的问题,进行插入操作的话会导致数据库中插入重复的字段!下面把我的解决方法记录一下,如果对您有所帮助,欢迎拍砖! 场景:EFC ...
- list源码4(参考STL源码--侯捷):transfer、splice、merge、reverse、sort
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...
- ASP.NET Core身份认证服务框架IdentityServer4(2)-整体介绍
一.整体情况 现代应用程序看起来更像这个: 最常见的相互作用: 浏览器与Web应用程序的通信 Browser -> Web App Web应用程序与Web API通信 基于浏览器的应用程序与We ...
- 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装OpenCV(离线方式和在线方式)(图文详解)
不多说,直接上干货! 说明: Anaconda2-5.0.0-Windows-x86_64.exe安装下来,默认的Python2.7 Anaconda3-4.2.0-Windows-x86_64.ex ...
- Linux 权限位详解
1. Linux 权限位 对于权限,有点绕,因为文件的权限和目录的权限是有一些区别的. 在Linux中,有5种权限,分别是,r.w.x.s.t. 可读权限:r 可写权限:w 可执行权限:x Setui ...
- java web路径和spring读取配置文件
此篇博客缘起:部署java web系统到阿里云服务器(ubuntu14.04)的时候,有以下两个问题 找不到自定义的property配置文件 上传图片的时候找不到路径 开发的时候是在windows上的 ...
- 第一册:lesson ninety-three。
原文: our new neighbor. Nigel is our new next-door neighbor. He is a pilot. He was in the R.A.F. He w ...
- .NET里面 abstract class和Interface有什么区别以及用法的展现?
前言 很多新人对这个问题已经看到的厌倦或者是恶心了,有可能是因为比较难理解或者是未理解的情况下对它们的认知不够所以产生的想法是差不多,不用抽奖类和接口我一样能实现我想要的功能. 这句话确实不假,但是实 ...