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. 2-Fourth Scrum Meeting20151204

    任务安排 闫昊: 今日完成:设计本地数据库. 明日任务:请假.(最近代码写得多……很累……) 唐彬: 今日完成:ios客户端代码的了解. 明日任务:ios客户端代码的深度学习. 史烨轩: 今日完成: ...

  2. 20162319 实验二 Java面对对象程序设计 实验报告

    实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...

  3. IT小小鸟读书笔记(3.9)

    对于IT小小鸟呢,我也不知道怎么说,或许一开始我就没想到这是一本集合了众多从事IT工作人员的学习,求职经历.读完这本书,说没什么感触,或许连我自己也不太相信. 在书的一开始邹欣就有说到:兴趣是第一原则 ...

  4. 07_Java基础语法_第7天(练习)_讲义

    今日内容介绍 1.循环练习 2.数组方法练习 01奇数求和练习 * A: 奇数求和练习 * a: 题目分析 * 为了记录累加和的值,我们需要定义一个存储累加和的变量 * 我们要获取到1-100范围内的 ...

  5. Mongodb 分片操作 介绍

    为什么需要分片操作?由于数据量太大,使得CPU,内存,磁盘I/O等压力过大.当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量.这时,我们就可以通过在多台 ...

  6. LeetCode题解:(221) Maximal Square

    题目说明 Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's a ...

  7. Delphi 获取Ip地址的方法总结

    通过注册表获取或修改Ip 想到Windows会把系统网卡相关信息存入注册表,肯定可通过注册表读取具体ip信息.大致思路是找HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\W ...

  8. sublime 对vue的高亮显示

    前提概要: sublime的下载地址:http://www.sublimetext.com/ notepad++下载地址:https://notepad-plus-plus.org/ .vue的文件在 ...

  9. 1使用 vue-cli 搭建项目(cp)

    http://www.cnblogs.com/wisewrong/p/6255817.html(copy:web) https://zhuanlan.zhihu.com/p/26183652(也很好) ...

  10. win xp安装

    Windows XP with sp3 VOL 微软原版下载: zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-74 ...