【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)
题干:
链接:https://ac.nowcoder.com/acm/contest/157/C
来源:牛客网
题目描述
PH试纸,是一种检测酸碱度的试纸,试纸红色为酸性,蓝色为碱性。
HtBest有一个PH试纸,试纸被分成了n段,每一段都可以被染色成红色或者蓝色,WHZ在试纸的每一段上都染为一种颜色,HtBest有m个询问,对于每个询问,Ta想知道某种颜色第qi次在什么地方出现。
输入描述:
第一行有两个正整数n,m。 第二行有n个字母(‘R’或’B’),每个第i个字母表示PH试纸第i段的颜色。 接下来m行,第i行有一个大写字母 ci(‘R’或’B’)和一个正整数qi ,用空格隔开,表示查询颜色ci 第qi 次出现的位置。
输出描述:
共m行,第i行一个整数,表示查询结果,若颜色ci出现次数少于qi次,则输出-1,否则输出颜色qi第ci次出现的位置。
示例1
输入
复制
2 2 RB R 1 B 1
输出
复制
1 2
示例2
输入
复制
2 2 BB R 1 B 2
输出
复制
-1 2
示例3
输入
复制
3 3 BRB B 1 B 2 R 1
输出
复制
1 3 2
备注:
对于100%的测试数据: 1 ≤ n, m ≤ 1000000 所有输入数据不超过1000000。 数据量较大,注意使用更快的输入输出方式。
解题报告:
直接维护两个前缀和,复杂度O(m)。
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e6 + 5;
int n,m;
char s[MAX];
int R[MAX],B[MAX],r,b;
int main()
{cin>>n>>m;scanf("%s",s+1);getchar();memset(R,-1,sizeof R);memset(B,-1,sizeof B);for(int i = 1; i<=n; i++) {if(s[i] == 'R') R[++r] = i;if(s[i] == 'B') B[++b] = i;}char ch[4];int x;while(m--) {scanf("%s%d",ch,&x);if(ch[0] == 'R') printf("%d\n",R[x]);else printf("%d\n",B[x]);}return 0 ;
}
进一步扩展:如果是1e5种颜色呢? 答:那也很简单啊1e5个vector就完事了。
再一步扩展:如果两种颜色带修改呢? 答:那就建两棵线段树,对应位置如果是当前线段树维护的颜色, 那就置为1 ,然后查询第k大。
终极扩展:那如果是1e5种颜色带修改呢? 答:那就主席树。每种颜色都建一棵4*n这么大的线段树,因为同构 所以压缩到一棵主席树里,查询就找该颜色对应的线段树 在线段树上二分,线段树上维护的是 是该树维护的颜色则该点记为1 其他颜色记为0。(%%%syt)
【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)相关推荐
- 【牛客 - 331E】炫酷划线(权值线段树,树状数组哈希,随机数)
题干: 链接:https://ac.nowcoder.com/acm/contest/331/E 来源:牛客网 平面上有一个圆,圆环上按顺时针顺序分布着从1到n,一共n个点. 现在无聊的小希开始按某种 ...
- 2021牛客暑期多校训练营7 xay loves trees dfs序 + 主席树
传送门 文章目录 题意: 思路: 题意: 给你两棵树,让你在第一棵树选一条最长的深度递增的链,链上每一个点在第二棵树上都不互为祖先. n≤3e5n\le3e5n≤3e5 思路: 之前做过差不多的题传送 ...
- BZOJ4627 前缀和 + 权值线段树
https://www.lydsy.com/JudgeOnline/problem.php?id=4627 题意:求序列中和在L到R之间的字串种数. 要求的是和的范围,我们可以考虑先求一个前缀和pre ...
- 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)
链接:https://ac.nowcoder.com/acm/contest/392/F 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 牛客小白月赛28—E会当凌绝顶,一览众山小(线段树)
链接:https://ac.nowcoder.com/acm/contest/7412/E 来源:牛客网 题目描述 牛牛最喜欢爬山了,他喜欢站在最高的山峰上展望. 牛牛来到山脚下,看到这里一共有 n ...
- 计蒜客 2020 蓝桥杯省赛 B 组模拟赛(五)E区间dp H 裴蜀 J dp A-J 权值线段树
题目链接 因为要去笔试.所以只打了两个小时,有点求快,很多细节没写好就匆匆交,而且没有检查,打的有点菜 C-煎牛排 做法: 所有的面的个数sum=2*n 然后sum/(2*k)即可. ans=ma ...
- 牛客练习赛84:牛客推荐系统开发之标签重复度(点分治+动态开点权值线段树)
题意: 给你一棵树,问树上所有两点路径上的(最大值最小值乘积)之和. 题解: 很明显的一个点分治问题,然后就是个二维偏序问题了(虽然我也不知道啥是二维偏序). 点分治不难,重点是点分治内cal函数如何 ...
- 牛客网 暑期ACM多校训练营(第一场)J.Different Integers-区间两侧不同数字的个数-离线树状数组 or 可持久化线段树(主席树)...
J.Different Integers 题意就是给你l,r,问你在区间两侧的[1,l]和[r,n]中,不同数的个数. 两种思路: 1.将数组长度扩大两倍,for(int i=n+1;i<=2* ...
- 2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并
传送门 文章目录 题意: 思路: 题意: 题面挺绕口的,还是看原题比较好. 大概的意思就是让你从给定的区间中选择一个以左端点为起点的一个上升子序列,让后将这些下标存下来,在bbb中将这些位置拿出来后, ...
最新文章
- POJ 3748:位操作
- jsp 获取项目路径,java获取项目路径
- Pycharm安装PyQT5调用QTDesigner
- Golang学习笔记——Slice
- 从概设流程、审美、设计思路几个方面,漫谈游戏美术设计的思维方式
- canny算子的理论分析
- 分享30个打动你的摄影师作品集网站
- 一亩地等于多少平方米?
- Your port 80 is actually used by : Server: Microsoft-IIS/10.0 Cannot install the Apache service, p
- 构建我的第一个 22TB 容量的家庭存储服务器
- 编程福利:50本C语言电子书,你还怕没书看吗!
- 东京攻略(一):计划与现实
- python 执行linux rm命令_Linux rm命令:删除文件
- oracle卸载步骤图解,Oracle完全卸载步骤
- 充分利用计算机研究GIS,关于地理信息系统GIS发展探究
- 电商卖家如何有效提升转化率?
- 第14章 Python网络爬虫
- node.js卸载与重装
- Pytorch中的多项分布multinomial.Multinomial().sample()解析
- Windows中文键盘消失
热门文章
- 数据结构四——散列表(上)
- java 并发 主键_高并发数据库自增主键分析
- python计算数组元素的和_python中数组的运算
- java数字不等于_java – 仅使用set中的数字查找等于或大于给定目标的总和
- python xlrd模块_python之xlrd模块
- c json输出html标签,Json编码HTML字符串
- 1195C. Basketball Exercise
- 十二个球称三次C语言编程,十二个球,有一个不知轻重,现有一个天平,称三次,找出此球!...
- cmd cd 无法切换目录_一分钟掌握cmd基础操作,告别鼠标
- echo off备份mysql_windows下备份Linux服务器上的MySQL