因为题中只有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. 通过Python将监控数据由influxdb写入到MySQL

    一.项目背景 我们知道InfluxDB是最受欢迎的时序数据库(TSDB).InfluxDB具有 持续高并发写入.无更新:数据压缩存储:低查询延时 的特点.从下面这个权威的统计图中,就可以看出Influ ...

  2. Java 并发编程(一) → LockSupport 详解

    开心一刻 今天突然收到花呗推送的消息,说下个月 9 号需要还款多少钱 我就纳了闷了,我很长时间没用花呗了,怎么会欠花呗钱? 后面我一想,儿子这几天玩了我手机,是不是他偷摸用了我的花呗 于是我找到儿子问 ...

  3. MindSpore保存与加载模型

    技术背景 近几年在机器学习和传统搜索算法的结合中,逐渐发展出了一种Search To Optimization的思维,旨在通过构造一个特定的机器学习模型,来替代传统算法中的搜索过程,进而加速经典图论等 ...

  4. Linux上的Shebang符号(#!)

    使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗? 本文了将给你简单介绍一下Shebang("#!")这个符号. 首先,这个符号(#!)的名称, ...

  5. Uva 642 - Word Amalgamation sort qsort

     Word Amalgamation  In millions of newspapers across the United States there is a word game called J ...

  6. JSX语法详解

    一.基础1.JSX是什么JSX是一种像下面这样的语法: const element = <h1>Hello, world!</h1>;1它是一种JavaScript语法扩展,在 ...

  7. mate桌面用户 root 自动登录lightdm.conf -20190520 方法【fedora 21】mate

    桌面用户自动登录lightdm.conf -20190520 方法修改 /etc/lightdm/lightdm.conf 步骤:1 vim  /etc/lightdm/lightdm.conf 解除 ...

  8. 二、Python流程控制练习题

    一.分支结构-if等 练习题: 练习1:英制单位与公制单位互换 练习2:掷骰子决定做什么 练习3:百分制成绩转等级制 练习4:输入三条边长如果能构成三角形就计算周长和面积 练习5:个人所得税计算器 练 ...

  9. 搭建LAMP环境部署discuz论坛

    !!!什么是LAMP: LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写: Linux,操作系统 Apache,网页服务器 MariaDB或MySQL,数据库管理系统(或者 ...

  10. cnetos 网卡绑定 eth0+eth1做双网卡绑定到bond0

    1.网卡绑定:eth0+eth1做双网卡绑定到bond0 二.网络配置 网卡绑定1./etc/sysconfig/network-scripts/目录下建立ifcfg-bond0文件,内容如下DEVI ...