P2787 语文1(chin1)- 理理思维

1.获取第x到第y个字符中字母k出现了多少次

2.将第x到第y个字符全部赋值为字母k

3.将第x到第y个字符按照A-Z的顺序排序


读字符串我再单个单个读我吃素(shi)好了


Solution

考前练线段树

字母不多, 开26个线段树即可

操作一直接查询

操作二给定颜色全部涂色, 其他全部去色

操作三先记录此区间有什么颜色, 在分别赋值即可

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#include<ctype.h>
#define LL long long
#define REP(i, x, y) for(int i = (x);i <= (y);i++)
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int maxn = 200019;
int num, na;
int v[maxn][26];//初始位置
#define lid (id << 1)
#define rid (id << 1) | 1
struct Seg_tree{
int l, r;
int sum, lazy;
}tree[maxn << 2][26];
void pushup(int id, int o){tree[id][o].sum = tree[lid][o].sum + tree[rid][o].sum;}
void build(int id, int l, int r, int o){
tree[id][o].l = l, tree[id][o].r = r, tree[id][o].lazy = -1;
if(l == r){
tree[id][o].sum = v[l][o];
return ;
}
int mid = (tree[id][o].l + tree[id][o].r) >> 1;
build(lid, l, mid, o), build(rid, mid + 1, r, o);
pushup(id, o);
}
void pushdown(int id, int o){
if(tree[id][o].lazy != -1){//涂或者不涂,直接覆盖
int val = tree[id][o].lazy;
tree[lid][o].sum = (tree[lid][o].r - tree[lid][o].l + 1) * val;
tree[rid][o].sum = (tree[rid][o].r - tree[rid][o].l + 1) * val;
tree[lid][o].lazy = val;
tree[rid][o].lazy = val;
tree[id][o].lazy = -1;
}
}
void update(int id, int val, int l, int r, int o){
pushdown(id, o);
if(tree[id][o].l == l && tree[id][o].r == r){
tree[id][o].sum = (tree[id][o].r - tree[id][o].l + 1) * val;
tree[id][o].lazy = val;
return ;
}
int mid = (tree[id][o].l + tree[id][o].r) >> 1;
if(mid < l)update(rid, val, l, r, o);
else if(mid >= r)update(lid, val, l, r, o);
else update(lid, val, l, mid, o), update(rid, val, mid + 1, r, o);
pushup(id, o);
}
int query(int id, int l, int r, int o){
pushdown(id, o);
if(tree[id][o].l == l && tree[id][o].r == r)return tree[id][o].sum;
int mid = (tree[id][o].l + tree[id][o].r) >> 1;
if(mid < l)return query(rid, l, r, o);
else if(mid >= r)return query(lid, l, r, o);
else return query(lid, l, mid, o) + query(rid, mid + 1, r, o);
}
char s;
void work1(){
int l = RD(), r = RD();
scanf("%c", &s);
s = toupper(s);
printf("%d\n", query(1, l, r, s - 'A'));
//puts("");puts("");puts("");
}
void work2(){
int l = RD(), r = RD();
scanf("%c", &s);
s = toupper(s);
REP(i, 0, 25){
if(i == s - 'A')update(1, 1, l, r, i);
else update(1, 0, l, r, i);
}
}
int ton[26];
void work3(){
int l = RD(), r = RD();
REP(i, 0, 25)ton[i] = query(1, l, r, i), update(1, 0, l, r, i);
REP(i, 0, 25){
if(ton[i] == 0)continue;
update(1, 1, l, l + ton[i] - 1, i);
l += ton[i];
}
}
char ss[maxn];
int main(){
num = RD(), na = RD(); scanf("%s", ss);
REP(i, 0, num - 1){
char now = ss[i];
int c = toupper(now) - 'A';
v[i + 1][c] = 1;
}
REP(i, 0, 25)build(1, 1, num, i);
while(na--){
int cmd = RD();
if(cmd == 1)work1();
else if(cmd == 2)work2();
else work3();
}
return 0;
}

P2787 语文1(chin1)- 理理思维的更多相关文章

  1. 【题解】Luogu P2787 语文1(chin1)- 理理思维

    原题传送门:P2787 语文1(chin1)- 理理思维 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树跑的飞快,但还是没有memset0小姐姐跑得快 操作1:暴力统计 ...

  2. [luogu] P2787 语文1(chin1)- 理理思维(分块)

    P2787 语文1(chin1)- 理理思维 题目背景 蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 考试开始了,可是蒟蒻HansBug脑中还是一片空白.哦不!准确 ...

  3. 2019.01.19 洛谷P2787 语文1(chin1)- 理理思维(ODT)

    传送门 ODTODTODT水题. 题意:有一个字母序列,支持区间赋值,查询区间某个字母的数量,区间按字母序排序. 思路: 可以开262626棵线段树搞过去,然而也可以用ODTODTODT秒掉. 如果用 ...

  4. 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)

    传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...

  5. 洛谷 P2787 语文1(chin1)- 理理思维

    题意简述 维护字符串,支持以下操作: 0 l r k:求l~r中k的出现次数 1 l r k:将l~r中元素赋值为k 2 l r:询问l~r中最大连续1的长度 题解思路 珂朵莉树暴力赋值,查询 代码 ...

  6. 洛谷P2787 语文1(chin1)- 理理思维

    洛谷题目链接 珂朵莉树吼啊!!! 对于操作$1$,直接普通查询即可 对于操作$2$,直接区间赋值即可 对于操作$3$,其实也并不难,来一次计数排序后,依次插入即可,(注意初始化计数器数组)具体实现看代 ...

  7. 题解【语文1(chin1)- 理理思维】

    link 喵~珂朵莉树AC 珂朵莉树?见此处~ 这数据结构太暴力了,所以不讲了 Code: #include<iostream> #include<cstdio> #inclu ...

  8. Java面经 面试经验 互联网公司面试经验 后端面试经验

    应聘相关 声明: 1,程序员相关的哈 2,万事无定论,比如说,就算你小学毕业,但是java基础却扎实到变态,我相信open的公司还是会给你机会的. 3,心态很重要,虽然日常的心态不容易控制,面试那俩小 ...

  9. P2412 查单词

    题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...

随机推荐

  1. BugPhobia开发篇章:绩效管理的层次优化

    0x00 :用0x00去书写一段故事 If you weeped for the missing sunset, you would miss all the shining stars 绩效管理,恐 ...

  2. 个人作业-Week 1

    1)快速看完整部教材,列出你仍然不懂的5到10个问题,发布在你的个人博客上. Q1:"Scrum Master不是一个官,而是一个没有行政权力的沟通者,就像微软的PM那样.他/她同时还要在团 ...

  3. java第一次实验报告

    北京电子科技学院(BESTI) 实    验    报    告 课程名称:java实验      班级:1352         姓名:潘恒      学号:20135209 成绩:         ...

  4. oracle 分页的sql语句

    已知有两种方法效率上貌似第一种更优: 1. select * from( select t1.*, rownum n from (select * from cm_log order by oper_ ...

  5. 我对git的认识

    Git 真的是不了解 也没听说过git 所以真的不知道从何谈起 所以就参考度娘啦! Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.Git 是 Linus To ...

  6. java 调用 oracle的function 和 procedure

    1.调用函数 CallableStatement cs=con.prepareCall("{?=call get_pname(?,?,?)}"); 第一个?表示返回的值,后面的?可 ...

  7. Cent7安装mysql5.7.11全过程

    下载mysql(注:其他版本未测试) https://cdn.mysql.com/archives/mysql-5.7/mysql-boost-5.7.11.tar.gz 1.安装依赖包 yum -y ...

  8. python自动化之时间

    cxz##############################现在时间######################### import time time.time() ############# ...

  9. C++ STL 常用查找算法

    C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...

  10. http请求头、响应头文件详解

    HTTP Request Header 请求头   解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏 ...