P2787 语文1(chin1)- 理理思维
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)- 理理思维的更多相关文章
- 【题解】Luogu P2787 语文1(chin1)- 理理思维
原题传送门:P2787 语文1(chin1)- 理理思维 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树跑的飞快,但还是没有memset0小姐姐跑得快 操作1:暴力统计 ...
- [luogu] P2787 语文1(chin1)- 理理思维(分块)
P2787 语文1(chin1)- 理理思维 题目背景 蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 考试开始了,可是蒟蒻HansBug脑中还是一片空白.哦不!准确 ...
- 2019.01.19 洛谷P2787 语文1(chin1)- 理理思维(ODT)
传送门 ODTODTODT水题. 题意:有一个字母序列,支持区间赋值,查询区间某个字母的数量,区间按字母序排序. 思路: 可以开262626棵线段树搞过去,然而也可以用ODTODTODT秒掉. 如果用 ...
- 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)
传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...
- 洛谷 P2787 语文1(chin1)- 理理思维
题意简述 维护字符串,支持以下操作: 0 l r k:求l~r中k的出现次数 1 l r k:将l~r中元素赋值为k 2 l r:询问l~r中最大连续1的长度 题解思路 珂朵莉树暴力赋值,查询 代码 ...
- 洛谷P2787 语文1(chin1)- 理理思维
洛谷题目链接 珂朵莉树吼啊!!! 对于操作$1$,直接普通查询即可 对于操作$2$,直接区间赋值即可 对于操作$3$,其实也并不难,来一次计数排序后,依次插入即可,(注意初始化计数器数组)具体实现看代 ...
- 题解【语文1(chin1)- 理理思维】
link 喵~珂朵莉树AC 珂朵莉树?见此处~ 这数据结构太暴力了,所以不讲了 Code: #include<iostream> #include<cstdio> #inclu ...
- Java面经 面试经验 互联网公司面试经验 后端面试经验
应聘相关 声明: 1,程序员相关的哈 2,万事无定论,比如说,就算你小学毕业,但是java基础却扎实到变态,我相信open的公司还是会给你机会的. 3,心态很重要,虽然日常的心态不容易控制,面试那俩小 ...
- P2412 查单词
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...
随机推荐
- Aspose.words Java基于模板生成word之纯文本内容
一,创建word模板 1.新建一个word文档 2.分别给四个参数设置域 (1)将鼠标置于想要设置域的地方 (2)设置域名 (3)设置好之后如下图所示 二,项目 1,引入maven依赖 <dep ...
- 面向对象OO第1-3次作业总结
面向对象OO第1-3次作业总结 学习OO已经四周了,对OO以及JAVA的编程也算终于了解了一丢丢.现在做完了三次的编程作业,对前三次的作业做一次总结. 第一次作业 ------------------ ...
- typedef struct bit0 : 1
这句话定义了一个位域,bit0是该位域的域名,而且bit0只占用一个位.位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.为了节省存储空间,并使处理简便,C语言提供了一种 ...
- 运行时错误 429,ACTIVEX部件不能创建对象的解决方法小结
错误描述: 发布在IIS上面的网站运行时出现如下错误: Microsoft VBscrīpt 运行时错误 错误 '800a01ad' ActiveX 部件不能创建对象 这个错误是asp组件未注册,而导 ...
- Enterprise Library 4.1 参考源码索引
http://www.projky.com/entlib/4.1/Microsoft/Practices/EnterpriseLibrary/AppSettings/Configuration/Des ...
- lr基本的概念
并发用户数量:与服务器进行交互的在线用户数量 请求响应时间:从client端发出请求到得到响应的整个时间,它一般包括网络相应时间+server的响应时间 事务请求响应时间:完成这个事务所用的时 ...
- 安装virtualbox
1.安装virtualbox https://www.virtualbox.org/ 2.安装centos6.6 3.配置网络 右键-->网络-->网卡2-->host-only c ...
- [转帖]overlay文件系统解析
overlay文件系统解析 来源:http://dockone.io/article/1511 原作者: 陈爱珍 布道师@七牛云 一个 overlay 文件系统包含两个文件系统,一个 upper 文件 ...
- leetcode动态规划
http://blog.csdn.net/u012162613/article/details/41428119
- [BinaryTree] AVL树、红黑树、B/B+树和Trie树的比较
转自:AVL树.红黑树.B/B+树和Trie树的比较 AVL树 最早的平衡二叉树之一.AVL是一种高度平衡的二叉树,所以通常的结果是,维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应 ...