因为题中只有a-z,所以区间中大量字母都是重复的,我们不妨利用桶的性质。

开一棵树,里面维护当前区间内的相同元素,若区间内元素不同,则为零

每次升序操作就先查询一遍区间,用桶将每个区间的a-z元素统计出,

然后按照顺序(L-L+tong[1]-1)..........进行区间修改,

注意要有向上修改的updata!!!

因为区间有很多字母相同,修改近似是mlogn*26(26次嘛....)查询mlong(n);

  1 #include<iostream>
2 #include<cstdio>
3 #include<string>
4 #include<algorithm>
5 #include<cmath>
6 #include<vector>
7 #include<map>
8 #include<cstring>
9 #define ll long long
10 #define MAXN 510000
11 using namespace std;
12 int read()
13 {
14 int x=0;char cc=getchar();
15 while(cc<'0'||cc>'9'){cc=getchar();}
16 while(cc>='0'&&cc<='9'){x=(x<<1)+(x<<3)+(cc^48);cc=getchar();}
17 return x;
18 }
19 char s[MAXN];
20 int tong[MAXN];int n,m;
21 struct node{int l,r,me;}T[MAXN*4];
22 void build(int k,int l,int r)
23 {
24 T[k].l=l;T[k].r=r;
25 //printf("l=%d r=%d\n",l,r);
26 if(l==r)
27 {
28 T[k].me=s[l]-'a'+1;
29 return ;
30 }
31 int mid=(l+r)>>1;
32 build(k<<1,l,mid);
33 build((k<<1)|1,mid+1,r);
34 if(T[(k<<1)].me==T[(k<<1)|1].me)
35 {
36 T[k].me=T[(k<<1)].me;
37 }
38 }
39 void pushdown(int k)
40 {
41 T[k<<1].me=T[k].me;
42 T[(k<<1)|1].me=T[k].me;
43 return ;
44 }
45 void updata(int k)
46 {
47 if(T[k<<1].me==T[(k<<1)|1].me)
48 T[k].me=T[k<<1].me;
49 else T[k].me=0;
50 }
51 void query(int k,int l,int r)
52 {
53 //printf("k=%d l=%d r=%d Tl=%d Tr=%d\n",k,l,r,T[k].l,T[k].r);
54 if(l<=T[k].l&&r>=T[k].r&&T[k].me!=0)
55 {
56 tong[T[k].me]+=T[k].r-T[k].l+1;
57 return ;
58 }
59 if(T[k].l==T[k].r)
60 {
61 return ;
62 }
63 if(T[k].me)pushdown(k);
64 int mid=(T[k].l+T[k].r)>>1;
65 if(l<=mid)query(k<<1,l,r);
66 if(r>mid)query((k<<1)|1,l,r);
67 return ;
68 }
69 int find(int k,int l)
70 {
71 if(T[k].l==T[k].r)
72 {
73 // printf("T[k].l=%d T[k].r=%d T[k].me=%d\n",T[k].l,T[k].r,T[k].me);
74 return T[k].me;
75 }
76 if(T[k].me)pushdown(k);
77 int mid=(T[k].l+T[k].r)>>1;
78 if(l<=mid)find(k<<1,l);
79 else find((k<<1)|1,l);
80 }
81 void add(int k,int l,int r,int x)
82 {
83 if(l<=T[k].l&&r>=T[k].r)
84 {
85 T[k].me=x;
86 //printf("xiugai k=%d l=%d r=%d x=%d\n",k,T[k].l,T[k].r,x);
87 return ;
88 }
89 if(T[k].me)pushdown(k);
90 int mid=(T[k].l+T[k].r)>>1;
91 if(l<=mid) add(k<<1,l,r,x);
92 if(r>mid) add((k<<1)|1,l,r,x);
93 updata(k);
94 //printf("---T[k].me=%d\n",T[13].me);
95 return ;
96 }
97 void clear(int k,int l,int r)
98 {
99 if(l<=T[k].l&&r>=T[k].r)
100 {
101 T[k].me=0;
102 }
103 if(T[k].l==T[k].r)return ;
104 int mid=(T[k].l+T[k].r)>>1;
105 if(l<=mid) clear(k<<1,l,r);
106 if(r>mid) clear((k<<1)|1,l,r);
107 return ;
108 }
109 void out()
110 {
111 for(int i=1;i<=n;++i)
112 {
113 putchar(find(1,i)+'a'-1);
114 }
115 printf("\n");
116 }
117 void work(int l,int r,int orz)
118 { //printf("------\n");
119 query(1,l,r);
120 //clear(1,l,r);
121 if(orz==1)
122 {
123 int kx=l;
124 for(int i=1;i<=26;++i)
125 {
126 //printf("tong[%d]=%d\n",i,tong[i]);
127 if(kx+tong[i]-1>=kx)
128 {
129 //printf("add=%d i=%d\n",kx,i);
130 add(1,kx,kx+tong[i]-1,i);
131 //out();
132 }
133 kx+=tong[i];
134 }
135 for(int i=1;i<=26;++i)tong[i]=0;
136 }
137 else
138 {
139 int kx=r;
140 for(int i=1;i<=26;++i)
141 {
142 if(kx-tong[i]+1<=kx)
143 {
144 add(1,kx-tong[i]+1,kx,i);
145 }
146 kx-=tong[i];
147 }
148 for(int i=1;i<=26;++i)tong[i]=0;
149 }
150 //out();
151 }
152 int main()
153 {
154 //freopen("text.in","r",stdin);
155 //freopen("wa.out","w",stdout);
156 n=read();m=read();
157 scanf("%s",s+1);
158 build(1,1,n);
159 for(int i=1;i<=m;++i)
160 {
161 int l,r,orz;
162 scanf("%d%d%d",&l,&r,&orz);
163 work(l,r,orz);
164 }
165 for(int i=1;i<=n;++i)
166 {
167 putchar(find(1,i)+'a'-1);
168 }
169 printf("\n");
170 }

【模拟8.01】string(线段树)的更多相关文章

  1. Codeforces 280D k-Maximum Subsequence Sum [模拟费用流,线段树]

    洛谷 Codeforces bzoj1,bzoj2 这可真是一道n倍经验题呢-- 思路 我首先想到了DP,然后矩阵,然后线段树,然后T飞-- 搜了题解之后发现是模拟费用流. 直接维护选k个子段时的最优 ...

  2. 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】

    一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...

  3. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  4. 考试题string——线段树。

    string[题目描述]给定一个由小写字母组成的字符串 s.有 m 次操作,每次操作给定 3 个参数 l,r,x.如果 x=1,将 s[l]~s[r]升序排序;如果 x=0,将 s[l]~s[r]降序 ...

  5. [CSP-S模拟测试]:Weed(线段树)

    题目描述 $duyege$的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹.为了查出真相,$duyege$准备修好电脑之后再进行一次金坷垃的模拟实验.电脑上面有若干层金坷垃,每次只能在上面撒上一层高度 ...

  6. BZOJ 1920 Luogu P4217 [CTSC2010]产品销售 (模拟费用流、线段树)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1920 (luogu) https://www.luogu.org/prob ...

  7. BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...

  8. BZOJ 3836 Codeforces 280D k-Maximum Subsequence Sum (模拟费用流、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=3836 (Codeforces) http://codeforces.com ...

  9. JZOJ P5829 HZOI 20190801 A string 线段树

    JZOJ P5829 A. string 题面:https://www.cnblogs.com/Juve/articles/11286476.html 考场上想起了排序这道题:https://www. ...

  10. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

随机推荐

  1. 更好的滚动体验>better-scroll

    认识better-scroll better-scroll是一款重点用于解决移动端(已支持PC)各种滚动场景需求的插件,可使页面滚动效果更加流畅且富有弹性 better-scroll是用纯JavaSc ...

  2. Jenkins 基础篇 - 插件安装

    这一小节主要介绍 Jenkins 插件的安装,登录到 Jenkins 后,依次进入到[系统管理]→ [插件管理]→ [可选插件],在这里可以看到所有的 Jenkins 插件,如下图: 我们在最开始安装 ...

  3. JAVA 面试相关

    1. int和Integer有什么区别? 答:Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类 ...

  4. 探索专有领域的端到端ASR解决之道

    摘要:本文从<Shallow-Fusion End-to-End Contextual Biasing>入手,探索解决专有领域的端到端ASR. 本文分享自华为云社区<语境偏移如何解决 ...

  5. goland:调试

    弹出框f9 会跳转到下一个断点

  6. [bug] MySQL 无法删除表

    参考 https://blog.csdn.net/smbluesky/article/details/82427121

  7. ]# dmesg | grep ATAcentos下查看网卡,主板,CPU,显卡,硬盘型号等硬件信息

    centos下查看网卡,主板,CPU,显卡,硬盘型号等硬件信息 osc_4o5tc4xq 2019/10/11 15:03 阅读数 253 centos下查看网卡,主板,CPU,显卡,硬盘型号等硬件信 ...

  8. 在/etc/profile下配置java的环境变量

    在/etc/profile下配置java的环境变量 原创 Java 作者:xiaoyan5686670 时间:2016-01-18 14:30:28  6152  0 以root用户编辑:#vi /e ...

  9. 四大浏览器JavaScript性能/硬件加速测试

    四大浏览器JavaScript性能/硬件加速测试 出处:快科技 2010-09-19 10:52:59    人气: 27925 次   作者:萧萧 编辑:萧萧[爆料]  评论(42)  收藏文章 新 ...

  10. FreeRTOS相关转载-(朱工的专栏)

    FreeRTOS系列第1篇---为什么选择FreeRTOS? 1.为什么学习RTOS? 作为基于ARM7.Cortex-M3硬件开发的嵌入式工程师,我一直反对使用RTOS.不仅因为不恰当的使用RTOS ...