P2787 语文1(chin1)- 理理思维(线段树)

  • 对每个字母开一棵线段树
  • 操作1就是区间查询
  • 操作2就是区间修改
  • 操作3可以看成 先预处理查询出区间对应的每个字母的个数,然后进行区间修改。
  • 然后没了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=5e4+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);
}
//区间修改 区间求和
#define il inline
#define lx x<<1
#define rx x<<1|1
#define len(x) (a[x].r-a[x].l+1)
char str[N];
struct SegTree{struct node{int l,r,lz;int s;}a[N<<2];il void re(int x){ a[x].s=a[lx].s+a[rx].s; }il void ptg(int x,int y){a[x].lz=y;if(y==1) a[x].s=len(x);else a[x].s=0;}il void pd(int x){if(a[x].lz){ptg(lx,a[x].lz),ptg(rx,a[x].lz);a[x].lz=0;}}il void bud(int x,int l,int r,char ch){a[x].l=l,a[x].r=r;if(l==r){a[x].s=(str[l]==ch);return;}int m=(l+r)>>1;bud(lx,l,m,ch),bud(rx,m+1,r,ch);re(x);}il void upd(int x,int l,int r,int val){if(a[x].lz==val) return;if(a[x].l>=l&&a[x].r<=r){ptg(x,val);return;}pd(x);int m=(a[x].l+a[x].r)>>1;if(l<=m) upd(lx,l,r,val);if(r>m) upd(rx,l,r,val);re(x);}il int que(int x,int l,int r){if(!a[x].s) return 0;if(a[x].l>=l&&a[x].r<=r) return a[x].s;pd(x);int m=(a[x].l+a[x].r)>>1;int ans=0;if(l<=m) ans+=que(lx,l,r);if(r>m) ans+=que(rx,l,r);return ans;}
}T[26];
int tmp[26];
int main(){int n,m;scanf("%d%d%s",&n,&m,str+1);rep(i,1,n) str[i]=toupper(str[i]);for(int i=0;i<26;i++) T[i].bud(1,1,n,'A'+i);while(m--){int op,l,r;scanf("%d%d%d",&op,&l,&r);char ch;if(op==1){scanf("\n%c",&ch);ch=toupper(ch);printf("%d\n",T[ch-'A'].que(1,l,r));}else if(op==2){scanf("\n%c",&ch);ch=toupper(ch);for(char i='A';i<='Z';++i){if(ch==i) T[i-'A'].upd(1,l,r,1);else T[i-'A'].upd(1,l,r,2);}}else {for(int i=0;i<26;i++){tmp[i]=T[i].que(1,l,r);T[i].upd(1,l,r,2);}for(int i=0;i<26;i++){if(tmp[i])T[i].upd(1,l,l+tmp[i]-1,1),l+=tmp[i];}         }}return 0;
}

P2787 语文1(chin1)- 理理思维(线段树)相关推荐

  1. duliu——思维+线段树

    题目 [题目描述] 小 `D` 喜欢出毒瘤题毒人.当然,他的毒瘤更多体现在若干个难题组合在同一场比赛时. 小 `D` 脑中有 $n$ 个毒瘤题 idea,第 $i$ 个的毒值为$d_i$.当第 $i$ ...

  2. CodeForces ABBYY Cup 3.0 - Finals B Shave Beaver! (思维+线段树)

    题目链接 题意:给你n个数1~n的序列,随后又q次询问,每次询问有2种操作,操作1:查询从序列中取出数值为x,x+1,...,y-1,y的数的最少需要取多少次(且每取一次只能是一个递增的子序列)    ...

  3. AtCoder - arc120_c Swaps 2(思维+线段树+模拟)

    题目链接:点击查看 题目大意:给出一个序列 aaa,问能否经过有限此操作使其变成 bbb,每次操作分为三步: 选择一个 iii,满足 i+1<=ni+1<=ni+1<=n,然后 sw ...

  4. Interesting Array CodeForces - 483D(思维+线段树)

    We'll call an array of n non-negative integers a[1], a[2], -, a[n] interesting, if it meets m constr ...

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

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

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

    题目背景 蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 考试开始了,可是蒟蒻HansBug脑中还是一片空白.哦不!准确的说是乱七八糟的.现在首要任务就是帮蒟蒻Han ...

  7. Luogu 2787 语文1(chin1)- 理理思维

    题目链接:传送门 题目背景 蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 考试开始了,可是蒟蒻HansBug脑中还是一片空白.哦不!准确的说是乱七八糟的.现在首要任 ...

  8. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

  9. C2 - Pokémon Army (hard version)(思维+差分/线段树+dp)详解

    https://codeforces.com/contest/1420/problem/C2 这道题十分的锻炼思维,也让我知道了同样是差分,从前面减后面和从后面减前面是有不同的意义的. 还记得c1吗? ...

最新文章

  1. 多目标跟踪 | AI产品经理需要了解的CV通识(三)
  2. 全球及中国塑料包装行业发展方向与应用前景调研报告2022版
  3. Security:CSRF
  4. 关于自适应宽度圆角的最简单的解决办法
  5. c语言中二维数组中产生随机数,C语言中是如何进行随机数生成的[多图]
  6. PieChart 饼图
  7. regexp_like 方法
  8. C程序设计语言现代方法09:函数
  9. 【实用工具】eclipse mac安装
  10. [转载] JavaParser 无法解析链式调用的问题
  11. C++自带排序函数sort( )
  12. 使用pyton在本地指定目录模拟服务器
  13. python将文本(txt)转excel(xls)
  14. Word制作学生点名册表格模板
  15. 初学者,学哪一种3d模型设计软件比较好?
  16. python google earth_如何用python编程控制GoogleEarth
  17. [异能程序员]第三章 异能初现(第三更)
  18. 论文总结:云安全研究方向及进展综述
  19. vue.js - 收藏集 - 掘金
  20. 仿小米通讯录 右侧滑动条与带动画的悬停列表实现(二)

热门文章

  1. 中职组网络安全C模块全漏洞脚本讲解包含4个漏洞的脚本
  2. 动态规划-矩阵中的最短路径
  3. Maven下载安装-配置环境变量+setting.xml配置文件的修改
  4. 提升客户服务体验的技巧
  5. 机器人D-H矩阵分析(SCARA机器人为例)
  6. MIT公开课18.06 Gilbert Strang 线性代数 笔记1 - Ax=b和四个子空间
  7. GP数据库事务年龄相关
  8. matlab脚本文件和函数文件
  9. 【PYLTP】pyltp(SentenceSplitter、Segmentor、Postagger、NamedEntityRecognizer、Parserr)个人理解(含可执行代码)
  10. 一个简单的PLC运动控制项目