区间 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的更多相关文章

  1. HDU 5726 GCD 区间GCD=k的个数

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  2. Codeforces 914D - Bash and a Tough Math Puzzle 线段树,区间GCD

    题意: 两个操作, 单点修改 询问一段区间是否能在至多一次修改后,使得区间$GCD$等于$X$ 题解: 正确思路; 线段树维护区间$GCD$,查询$GCD$的时候记录一共访问了多少个$GCD$不被X整 ...

  3. bzoj 5028: 小Z的加油店——带修改的区间gcd

    Description 小Z经营一家加油店.小Z加油的方式非常奇怪.他有一排瓶子,每个瓶子有一个容量vi.每次别人来加油,他会让 别人选连续一段的瓶子.他可以用这些瓶子装汽油,但他只有三种操作: 1. ...

  4. dutacm.club 1094: 等差区间(RMQ区间最大、最小值,区间GCD)

    1094: 等差区间 Time Limit:5000/3000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)Total ...

  5. HDU5381【莫队算法+区间GCD特性】

    前言: 主要最近在刷莫队的题,这题GCD的特性让我对莫队的使用也有了新的想法.给福利:神犇的一套莫队算法题 先撇开题目,光说裸的一个莫队算法,主要的复杂度就是n*sqrt(n)对吧,这里我忽略了一个左 ...

  6. HDU 5726 GCD (2016多校、二分、ST表处理区间GCD、数学)

    题目链接 题意 : 给出一个有 N 个数字的整数数列.给出 Q 个问询.每次问询给出一个区间.用 ( L.R ) 表示.要你统计这个整数数列所有的子区间中有多少个和 GCD( L ~ R ) 相等.输 ...

  7. 区间gcd

    http://codeforces.com/problemset/problem/914/D 题意:给你n个数,两种操作:1.询问区间[l,r]在至多一次修改一个数的条件下区间gcd是否等于x. 2. ...

  8. 区间加值,区间gcd, 牛客949H

    牛客小白月赛16H 小阳的贝壳 题目链接 题意 维护一个数组,支持以下操作: 1: 区间加值 2: 询问区间相邻数差的绝对值的最大值 3: 询问区间gcd 题解 设原数组为\(a\), 用线段树维护\ ...

  9. 洛谷 P5502 - [JSOI2015]最大公约数(区间 gcd 的性质+分治)

    洛谷题面传送门 学校模拟赛的某道题让我联想到了这道题-- 先讲一下我的野鸡做法. 首先考虑分治,对于左右端点都在 \([L,R]\) 中的区间我们将其分成三类:完全包含于 \([L,mid]\) 的区 ...

随机推荐

  1. Go语言标准库之flag

    Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单. os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数. ...

  2. Java 中创建对象的 5 种方式!

    Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 Employee类: class Employee implements Cloneable, Serializable { pri ...

  3. Springboot国际化信息(i18n)解析

    国际化信息理解 国际化信息也称为本地化信息 . Java 通过 java.util.Locale 类来表示本地化对象,它通过 “语言类型” 和 “国家/地区” 来创建一个确定的本地化对象 .举个例子吧 ...

  4. Apache RocketMQ 消息队列部署与可视化界面安装

    一.介绍 Apache RocketMQ是一个分布式.队列模型的消息中间件,具有低延迟.高性能和高可靠.万亿级容量和灵活的可扩展性.核心组件由四部分组成:Name Servers,Brokers,Pr ...

  5. rabbitmqctl: Error unable to connect to node 'rabbit@xxxxx' nodedown

    RabbitMQ使用rabbitmqctl add_user的时候报以下错误: Creating user "xxxx" ... Error: unable to connect ...

  6. 基于LeNet的手写汉字识别(caffe)

    我假设已经成功编译caffe,如果没有,请参考http://caffe.berkeleyvision.org/installation.html 在本教程中,我假设你的caffe安装目录是CAFFE_ ...

  7. sudo apt-get install 、 pip install和conda install的对比

    sudo apt-get install: apt-get可以用来安装软件.更新源,也可以用来更新自Ubuntu的典型依赖包. (sudo apt-get remove --purge 软件名称 su ...

  8. Hadoop 之 MapReduce原理

    1.什么是MapReduce 答:简而言之,就是将一个大任务分成多个小的子任务(Map),并行执行后,合并结果(Reduce).下面举一个纸牌得栗子  2.MapReduce的运行流程  3.JobT ...

  9. 程序员写 2000 行 if else?领导:这个锅我不背

    前言 知乎上有小伙伴提了这么一个问题,如何看待陕西省普通话水平测试成绩查询系统?查询系统前端代码就直接给出了身份账号,姓名,证书编号,如果信息是真的,就泄露了这么多考生的信息,白给那种.为什么会发生这 ...

  10. C#实现请求唯一性校验支持高并发

    使用场景描述: 网络请求中经常会遇到发送的请求,服务端响应是成功的,但是返回的时候出现网络故障,导致客户端无法接收到请求结果,那么客户端程序可能认为判断为网络故障,而重复发送同一个请求.当然如果接口中 ...