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. sqlDataAdapter和SqlCommand的区别

    因为DataSet是离线的,所以SqlDataAdapter这个对象是连接DataSet和数据库的桥梁,所有对DataSet的操作(填充,更新等)都要通过他 ado.net数据访问有两种方式: 1.离 ...

  2. __weak与__block修饰符区别

    API Reference对__block变量修饰符的解释,大概意思: 1.__block对象在block中是可以被修改.重新赋值的. 2.__block对象在block中不会被block强引用一次, ...

  3. Linux操作系统(三)

    文件系统: boot sector:记录引导文件 sb: super block 每个文件系统只有一个sb,其余black group均是它的备份 读写文件会进入到inode operation vf ...

  4. Promise 记录

  5. xpath 去除空格

    normalize,字面意思就是正规化 加入space  大概意思就是空格的处理了 官方解释是这样的: 通过去掉前导和尾随空白并使用单个空格替换一系列空白字符,使空白标准化.如果省略了该参数,上下文节 ...

  6. mysql DDL、DML、DCL、DQL区分

    mysql [Structure Query Language] 的组成分4个部分: DDL     [Data Mefinition Language]    数据定义语言 DML    [Data ...

  7. mysql 随机获取一条或多条数据

    若要在i ≤r≤ j 这个范围得到一个随机整数r ,需要用到表达式 FLOOR( RAND() * (j – i)+i),RLOOR()取整树部分,RAND()生成0~1的随机数.ROUND(x,n) ...

  8. Java 使用 dom4j 读取 xml文档 demo

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://www. ...

  9. RHEL/Centos下Sendmail服务器搭建

    目的 Linux下配置Sendmail服务器,并通过客户端验证. 环境 Cento6 局域网(可访问互联网) 内容 配置Sendmail服务器,使得客户端能够通过foxmail或者outlook ex ...

  10. python的N个小功能(图片预处理:打开图片,滤波器,增强,灰度图转换,去噪,二值化,切割,保存)

    ############################################################################################# ###### ...