区间 GCD
区间 GCD
题目描述
最近 JC 同学刚学会 gcd,于是迷上了与 gcd 有关的问题。今天他又出了一道这样的题目,
想要考考你,你能顺利完成吗?
给定一个长度为 n 的字符串 s[1..n],串仅包含小写字母。对于区间 [l, r],你需要回答 s[l..r]
中有多少个长度为 3 的子序列组成了"gcd",即有多少组 (i, j, k) 满足 l ≤ i < j < k ≤ r, s[i] =
'g', s[j] = 'c', s[k] = 'd'。
输入格式
第一行为一个字符串 s。
第二行为一个整数 q,表示询问数量。
接下来 q 行,每行两个整数 l i , r i ,表示一组询问。
输出格式
输出共 q 行,表示每一组询问的答案。答案请对 2 31 取模后输出。
样例输入
glygshcyjcdzy
3
1 11
2 11
2 10
样例输出
4
2
0
数据规模与约定
对于 20% 的数据,n ≤ 300, q = 1。
对于 40% 的数据,n ≤ 300, q ≤ 300。
对于 70% 的数据,n ≤ 4000, q ≤ 4000。
对于 100% 的数据,n ≤ 80000, q ≤ 80000。
串仅包含小写字母。1 ≤ l i ≤ r i ≤ n。
题解:
这个题目仔细想想其实是考试里最简单的一道题,但还是让我很有启发。
首先,我们考虑维护区间的g,c,d,gc,cd,gcd的个数,怎么维护呢?
g,c,d可以直接统计,如果用线段树做的话,gc的个数=ls的gc数+rs的gc+ls]的g数*rs的c数,cd数同理,然后gcd数了,gcd数=ls的gcd+rs的gcd+ls的gc*rs的d+ls的g*rs的cd;其实这样讲的话感觉就一点也不神奇,很理所当然了,但是至少启发我们线段树中可以理由递推关系记一些元素推出一些元素。当然返回的时候返回的是结构题。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define ll long long
#define MAXN 80100
using namespace std;
int sum[MAXN],len,q;
ll ans=,mod=(ll)<<;
char s[MAXN];
struct tree{
ll g,c,d,gc,cd,gcd;
int l,r;
}a[MAXN*]; void pushup(int xv){
int ls=xv*,rs=xv*+;
a[xv].g=a[ls].g+a[rs].g;
a[xv].c=a[ls].c+a[rs].c;
a[xv].d=a[ls].d+a[rs].d;
a[xv].cd=(a[ls].cd+a[rs].cd+a[ls].c*a[rs].d)%mod;
a[xv].gc=(a[ls].gc+a[rs].gc+a[ls].g*a[rs].c)%mod;
a[xv].gcd=(a[ls].gcd+a[rs].gcd+a[ls].gc*a[rs].d+a[ls].g*a[rs].cd)%mod;
} void build(int xv,int l,int r){
if(l==r){
a[xv].l=l,a[xv].r=r;
a[xv].g=a[xv].d=a[xv].c=a[xv].gc=a[xv].cd=;
if(s[l]=='g') a[xv].g=;
if(s[l]=='c') a[xv].c=;
if(s[l]=='d') a[xv].d=;
return;
}
a[xv].l=l,a[xv].r=r;
int mid=(l+r)/;
build(xv*,l,mid);
build(xv*+,mid+,r);
pushup(xv);
} tree query(int xv,int l,int r){
int L=a[xv].l,R=a[xv].r,mid=(L+R)/;
if(l==L&&r==R){
return a[xv];
}
if(r<=mid) return query(xv*,l,r);
else if(l>mid) return query(xv*+,l,r);
else {
tree ls=query(xv*,l,mid),rs=query(xv*+,mid+,r),xvv;
xvv.g=ls.g+rs.g;
xvv.c=ls.c+rs.c;
xvv.d=ls.d+rs.d;
xvv.cd=(ls.cd+rs.cd+ls.c*rs.d)%mod;
xvv.gc=(ls.gc+rs.gc+ls.g*rs.c)%mod;
xvv.gcd=(ls.gcd+rs.gcd+ls.gc*rs.d+ls.g*rs.cd)%mod;
return xvv;
}
} int main()
{
scanf("%s",s+);
len=strlen(s+);
build(,,len);
scanf("%d",&q);
while(q--){
int l,r;scanf("%d%d",&l,&r);
printf("%lld\n",query(,l,r).gcd%mod);
}
return ;
}
区间 GCD的更多相关文章
- HDU 5726 GCD 区间GCD=k的个数
GCD Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- Codeforces 914D - Bash and a Tough Math Puzzle 线段树,区间GCD
题意: 两个操作, 单点修改 询问一段区间是否能在至多一次修改后,使得区间$GCD$等于$X$ 题解: 正确思路; 线段树维护区间$GCD$,查询$GCD$的时候记录一共访问了多少个$GCD$不被X整 ...
- bzoj 5028: 小Z的加油店——带修改的区间gcd
Description 小Z经营一家加油店.小Z加油的方式非常奇怪.他有一排瓶子,每个瓶子有一个容量vi.每次别人来加油,他会让 别人选连续一段的瓶子.他可以用这些瓶子装汽油,但他只有三种操作: 1. ...
- dutacm.club 1094: 等差区间(RMQ区间最大、最小值,区间GCD)
1094: 等差区间 Time Limit:5000/3000 MS (Java/Others) Memory Limit:163840/131072 KB (Java/Others)Total ...
- HDU5381【莫队算法+区间GCD特性】
前言: 主要最近在刷莫队的题,这题GCD的特性让我对莫队的使用也有了新的想法.给福利:神犇的一套莫队算法题 先撇开题目,光说裸的一个莫队算法,主要的复杂度就是n*sqrt(n)对吧,这里我忽略了一个左 ...
- HDU 5726 GCD (2016多校、二分、ST表处理区间GCD、数学)
题目链接 题意 : 给出一个有 N 个数字的整数数列.给出 Q 个问询.每次问询给出一个区间.用 ( L.R ) 表示.要你统计这个整数数列所有的子区间中有多少个和 GCD( L ~ R ) 相等.输 ...
- 区间gcd
http://codeforces.com/problemset/problem/914/D 题意:给你n个数,两种操作:1.询问区间[l,r]在至多一次修改一个数的条件下区间gcd是否等于x. 2. ...
- 区间加值,区间gcd, 牛客949H
牛客小白月赛16H 小阳的贝壳 题目链接 题意 维护一个数组,支持以下操作: 1: 区间加值 2: 询问区间相邻数差的绝对值的最大值 3: 询问区间gcd 题解 设原数组为\(a\), 用线段树维护\ ...
- 洛谷 P5502 - [JSOI2015]最大公约数(区间 gcd 的性质+分治)
洛谷题面传送门 学校模拟赛的某道题让我联想到了这道题-- 先讲一下我的野鸡做法. 首先考虑分治,对于左右端点都在 \([L,R]\) 中的区间我们将其分成三类:完全包含于 \([L,mid]\) 的区 ...
随机推荐
- Asterisk13.23.1如何增加G723编码和G729编码
文章主要将如何配置Asterisk G729的编码和G723的编码问题 今天在配置语音电话过程中踩到一个坑,就是在对接线路过程中出现了一个报错,在传到对方线路过程中出现无法转码从而导致报错. 查看了下 ...
- Java日志框架SLF4J和log4j以及logback的联系和区别
1.SLF4J(Simple logging Facade for Java) 意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接 ...
- Go第三方日志库logrus
日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库的基本使用. logrus介绍 Logru ...
- 2019沈阳网络赛B.Dudu's maze
https://www.cnblogs.com/31415926535x/p/11520088.html 啊,,不在状态啊,,自闭一下午,,都错题,,然后背锅,,,明明这个简单的题,,, 这题题面不容 ...
- HTML连载37-边框属性(下)、边框练习
一.边框属性 1.连写(分别设置四条边的边框) border-width:上 右 下 左: border-style:上 右 下 左: border-color:上 右 下 左: 注意点: (1)这三 ...
- .Net基础篇_学习笔记_第七天_三元数表达式(if-else的转换写法)
三元表达式语法: 表达式1?表达式2:表达式3; 表达式1一般为一个关系表达式.如果表达式1的值为true,那么表达式2的值就是整个三元表达式的值.如果表达式1的值为false,那么表达式3的值就是整 ...
- 注解@Async解决异步调用问题
序言:Spring中@Async 根据Spring的文档说明,默认采用的是单线程的模式的.所以在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的. 那么当多个任务的执行势必会相互影响. ...
- charles 外部代理设置
本文参考:charles 外部代理设置 external proxy 外部代理设置 有时候您可能需要使用网络上的代理服务器才能访问Internet. 在这种情况下,您需要为Charles配置外部代理. ...
- AWS加入.NET Foundation企业赞助商计划
.NET 走向开源,MIT许可协议. 微软为了推动.NET开源社区的发展,2014年联合社区成立了.NET基金会. .NET基金会是一个独立的组织,支持.NET社区和开源,旨在拓宽和加强.NET生态系 ...
- 【Java】SpringBoot 中从application.yml中获取自定义常量
由于这里我想通过java连接linux,connection连接需要host.port.username.password及其他路径等等.不想每次修改的时候都去改源文件,所以想写在applicatio ...