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

题目背景

蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白。

题目描述

考试开始了,可是蒟蒻HansBug脑中还是一片空白。哦不!准确的说是乱七八糟的。现在首要任务就是帮蒟蒻HansBug理理思维。假设HansBug的思维是一长串字符串(字符串中包含且仅包含26个字母),现在的你,有一张神奇的药方,上面依次包含了三种操作:

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

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

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

你欣喜若狂之时,可是他脑细胞和RP已经因为之前过度紧张消耗殆尽,眼看试卷最后还有一篇800字的作文呢,所以这个关键的任务就交给你啦!

输入输出格式

输入格式:

第一行包含两个整数N、M,分别表示HansBug的思维所包含的字母个数和药方上操作个数。

第二行包含一个长度为N的字符串,表示HansBug的思维。

第3-M+2行每行包含一条操作,三种操作格式如下:

  1. 操作1: 1 xi yi ki 表示将第xi到第yi个字符中ki出现的次数输出

  2. 操作2: 2 xi yi ki 表示将第xi到第yi个字符全部替换为ki

  3. 操作3: 3 xi yi 表示将第xi到第yi个字符按照A-Z的顺序排序

输出格式:

输出为若干行,每行包含一个整数,依次为所有操作1所得的结果。

输入输出样例

输入样例#1: 复制

10 5

ABCDABCDCD

1 1 3 A

3 1 5

1 1 3 A

2 1 2 B

1 2 3 B

输出样例#1: 复制

1

2

2

说明

样例说明:

数据规模:

此题目中大小写不敏感。

题解

是道傻逼题。

顺便AC700祭。

作死去写分块。

发现只有第三个操作比较玄学。

第三个操作其实你可以这么想

先把这段的每个字母总数用操作一提出来,

一段一段按照第二操作覆盖就好。

这个时候还有一个问题

原数组怎么处理。

当然是打标记.jpg

这怎么会有紫题woc

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define freopen Epiphyllum_thief
using namespace std;
const int N=2e5;
int l[1001],r[1001],sum[1001][51];
int n,m,ch[N],num,addx[1001];
int bl[N];
char s[N]; int read(){
int x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
} void build(){
for(int i=1;i<=num;i++)
l[i]=(i-1)*num+1,r[i]=i*num;r[num]=n;
for(int i=1;i<=num;i++){
for(int j=l[i];j<=r[i];j++){
sum[i][ch[j]]++;bl[j]=i;
}
}
} void update(int x,int y,int tmp){
if(bl[x]==bl[y]){
if(addx[bl[x]])
for(int i=l[bl[x]];i<=r[bl[y]];i++)
ch[i]=addx[bl[x]]; addx[bl[x]]=0;
for(int i=x;i<=y;i++)
sum[bl[x]][ch[i]]--,sum[bl[x]][tmp]++,ch[i]=tmp;
return ;
}
if(addx[bl[x]]){
for(int i=l[bl[x]];i<=r[bl[x]];i++)ch[i]=addx[bl[x]];
addx[bl[x]]=0;
}
for(int i=x;i<=r[bl[x]];i++)
sum[bl[x]][ch[i]]--,sum[bl[x]][tmp]++,ch[i]=tmp;
for(int i=bl[x]+1;i<=bl[y]-1;i++)
memset(sum[i],0,sizeof(sum[i])),sum[i][tmp]=num,addx[i]=tmp;
if(addx[bl[y]]){
for(int i=l[bl[y]];i<=r[bl[y]];i++)ch[i]=addx[bl[y]];
addx[bl[y]]=0;
}
for(int i=l[bl[y]];i<=y;i++)
sum[bl[y]][ch[i]]--,sum[bl[y]][tmp]++,ch[i]=tmp;
} int query(int x,int y,int tmp){
int ans=0;
if(bl[x]==bl[y]){
if(addx[bl[x]])
for(int i=l[bl[x]];i<=r[bl[x]];i++)
ch[i]=addx[bl[x]]; addx[bl[x]]=0;
for(int i=x;i<=y;i++)if(ch[i]==tmp)ans++;
return ans;
}
if(addx[bl[x]]){
for(int i=l[bl[x]];i<=r[bl[x]];i++)ch[i]=addx[bl[x]];
addx[bl[x]]=0;
}
for(int i=x;i<=r[bl[x]];i++)
ans+=(ch[i]==tmp);
for(int i=bl[x]+1;i<=bl[y]-1;i++)ans+=sum[i][tmp];
if(addx[bl[y]]){
for(int i=l[bl[y]];i<=r[bl[y]];i++)ch[i]=addx[bl[y]];
addx[bl[y]]=0;
}
for(int i=l[bl[y]];i<=y;i++)
ans+=(ch[i]==tmp);
return ans;
} void exchange(int x,int y){
int tot[27];
for(int i=1;i<=26;i++)tot[i]=query(x,y,i);
int h=x,t=y;
for(int i=1;i<=26;i++){
if(!tot[i])continue;
update(h,h+tot[i]-1,i);
h+=tot[i];
}
} int main(){
Epiphyllum_thief("data.in","r",stdin);
Epiphyllum_thief("ans.out","w",stdout);
n=read();m=read();
num=sqrt(n);if(num*num<n)num++;
scanf("%s",s+1);
for(int i=1;i<=n;i++){
if(s[i]>='A'&&s[i]<='Z')ch[i]=s[i]-'A'+1;
else ch[i]=s[i]-'a'+1;
}build();
while(m--){
int opt=read();
if(opt==1){
char ss[10];
int x=read(),y=read(),tmp;
scanf("%s",ss);
if(ss[0]>='A'&&ss[0]<='Z')tmp=ss[0]-'A'+1;
else tmp=ss[0]-'a'+1;
printf("%d\n",query(x,y,tmp));
}
if(opt==2){
int x=read(),y=read(),tmp;
char ss[10];
scanf("%s",ss);
if(ss[0]>='A'&&ss[0]<='Z')tmp=ss[0]-'A'+1;
else tmp=ss[0]-'a'+1;
update(x,y,tmp);
}
if(opt==3){
int x=read(),y=read();
exchange(x,y);
}
}return 0;
}

[luogu] P2787 语文1(chin1)- 理理思维(分块)的更多相关文章

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

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

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

    P2787 语文1(chin1)- 理理思维 1.获取第x到第y个字符中字母k出现了多少次 2.将第x到第y个字符全部赋值为字母k 3.将第x到第y个字符按照A-Z的顺序排序 读字符串我再单个单个读我 ...

  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. Luogu 1031 - 均分纸牌 - [有意思的思维题]

    题目链接:https://www.luogu.org/problemnew/show/P1031 题目描述有 $N$ 堆纸牌,编号分别为 $1,2,…,N$.每堆上有若干张,但纸牌总数必为 $N$ 的 ...

  9. 【Luogu】P3203弹飞绵羊(分块)

    题目链接 正解是LCT但我不会呀蛤蛤蛤蛤蛤 (分块我也没想出来 把区间分成根n个块,每个块内记录两个东西,就是该位置弹多少次能够弹出这个块,以及该位置弹到最后弹出去了之后能够弹到哪里. 然后查询就一个 ...

随机推荐

  1. 一些html5

    ---匿名函数(funcation(){}())---- 一.拖拽 draggable=ture-----A拖动元素上事件 1. 拖拽开始:ondragstart2. 拖拽中:ondrag3. 拖拽结 ...

  2. BZOJ 2780 Sevenk Love Oimaster (后缀自动机+树状数组+dfs序+离线)

    题目大意: 给你$n$个大串和$m$个询问,每次给出一个字符串$s$询问在多少个大串中出现过 好神的一道题 对$n$个大串建出广义$SAM$,建出$parent$树 把字符串$s$放到$SAM$里跑, ...

  3. [USACO17JAN] Subsequence Reversal序列反转 (dfs+记忆化)

    题目大意:给你一个序列,你可以翻转任意一段子序列一次,求最长不下降子序列长度 tips:子序列可以不连续,但不能破坏在原序列中的顺序 观察数据范围,n<=50,很小,考虑dfs *dfs来跑区间 ...

  4. 2019-03-21 Python Request InsecureRequestWarning

    问题: 使用Python3 requests发送HTTPS请求,已经关闭认证(verify=False)情况下,控制台会输出以下错误: InsecureRequestWarning: Unverifi ...

  5. jQuery 事件流的概念

    jQuery  事件流的概念 什么是事件流 DOM事件流 1. 事件捕获阶段; 2.处于目标阶段; 3.事件冒泡阶段; <!DOCTYPE html> <html lang=&quo ...

  6. vue懒加载

    vue懒加载(白屏或者加载慢的解决方法) 懒加载:也叫延迟加载,即在需要的时候进行加载,随用随载. 为什么需要懒加载? 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异 ...

  7. SpringCloud 构建微服务架构-练习

    我使用的springboot的版本为2.0.2.RELEASE,这里概念性的东西我就不粘贴复制了,百度一下 都是 一.启动Eureka注册中心服务 1.新建springboot项目,pom.xml配置 ...

  8. Android-Universal-Image-Loader学习笔记(3)--内存缓存

    前面的两篇博客写了文件缓存.如今说说Android-Universal-Image-Loader的内存缓存.该内存缓存涉及到的类如图所看到的 这些类的继承关系例如以下图所看到的: 如同文件缓存一样,内 ...

  9. ValidForm的使用

    1.引入css 请查看下载文件中的style.css,把里面Validform必须部分拷贝到你的css中(文件中这个凝视 "/*==========下面部分是Validform必须的==== ...

  10. iOS开发UI调试神器----Reveal

    做iOS的开发,UI是非常非常重要的一环.调试时我们一般用模拟器,提交前用真机做測试.用模拟器来调试UI效果尽管快捷方便,但有时仍然希望有更强大的工具来帮助分析UI,尤其是专注在UI的效果调试时.近期 ...