正解炸了……

考试的时候想到了正解,非常高兴的打出来了线段树,又调了好长时间,对拍了一下发现除了非常大的点跑的有点慢外其他还行。因为复杂度算着有点高……

最后正解死于常数太大……旁边的lyl用同样的算法拿了90分我却拿了个暴力的分40……花了那么多时间一分没多拿原地爆炸……

由于大部分时间押在了T1,然后考试就炸了……

题解:

因为字符串长度虽然很大,但是只有26个字符,考虑桶排,用线段树每个节点开一个26的桶,维护这个区间中各个数的个数,对于排序就可以拆成26次区间赋值。然而这样的down函数的复杂度是26,于是整个算法的复杂度就成了$nlog_n*26^2$,40分成功炸掉(加两个优化可以搞到60分),然后就有lyl及其没有素质地给他循环展开了,AC……

还是说正解吧,和‘花神游历各国’类似,线段树维护这一段的值,不一样则为0,本来以为这样会很慢,但是它会越来越快:每次排序最多增加2个块,但这种增加是有限制的,大部分情况下块是在减少,所以它会越来越快。由于此时的down是O1的,于是总复杂度$nlog_n*26$,成功A掉。

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #define MAXN 100010
  5 using namespace std;
  6 struct tree
  7 {
  8     int l,r,sum;
  9     #define l(x) tr[x].l
 10     #define r(x) tr[x].r
 11     #define ls(x) (x*2)
 12     #define rs(x) ((ls(x))+1)
 13     #define sum(x) tr[x].sum
 14 }tr[MAXN*100];
 15 char a[MAXN];
 16 int n,m,yz[MAXN];
 17 void pushup(int x)
 18 {
 19     if(l(x)==r(x))return;
 20     sum(x)=(sum(ls(x))==sum(rs(x))?sum(ls(x)):0);
 21 }
 22 void build(int l,int r,int x)
 23 {
 24     l(x)=l,r(x)=r;
 25     if(l==r){sum(x)=a[l];yz[l]=x;return;}
 26     int mid=(l+r)>>1;
 27     build(l,mid,ls(x));
 28     build(mid+1,r,rs(x));
 29     pushup(x);
 30 }
 31 void down(int x)
 32 {
 33     if(!sum(x))return;
 34     if(l(x)!=r(x))sum(ls(x))=sum(rs(x))=sum(x);
 35 }
 36 void add(int l,int r,int x,int data)
 37 {
 38     if((l(x)>=l&&r(x)<=r)||sum(x)==data)
 39     {sum(x)=data;down(x);return;}
 40     down(x);
 41     int mid=(l(x)+r(x))>>1;
 42     if(l<=mid)add(l,r,ls(x),data);
 43     if(r>mid) add(l,r,rs(x),data);
 44     pushup(x);
 45 }
 46 int t[27];
 47 void ask(int l,int r,int x)
 48 {
 49     down(x);
 50     if(l>r(x)||r<l(x))return;
 51     if(l<=l(x)&&r>=r(x)&&sum(x))
 52     {
 53         t[sum(x)]+=r(x)-l(x)+1;
 54         return;
 55     }
 56     down(x);
 57     int mid=(l(x)+r(x))>>1;
 58     if(l<=mid)ask(l,r,ls(x));
 59     if(r>mid) ask(l,r,rs(x));
 60 }
 61 void work(int x,int l,int r)
 62 {
 63     memset(t,0,sizeof(t));
 64     ask(l,r,1);
 65     int tl=l;
 66     if(x==1)
 67     {
 68         for(register int i=1;i<=26;i++)
 69         if(t[i])
 70         {
 71             add(tl,tl+t[i]-1,1,i);
 72             tl=tl+t[i];
 73         }
 74     }
 75     else
 76     {
 77         for(register int i=26;i>=1;i--)
 78         if(t[i])
 79         {
 80             add(tl,tl+t[i]-1,1,i);
 81             tl=tl+t[i];
 82         }
 83     }
 84 }
 85 void dfs(int x)
 86 {
 87     down(x);
 88     if(l(x)==r(x))return;
 89     dfs(ls(x)),dfs(rs(x));
 90 }
 91 inline int read();
 92 signed main()
 93 {
 94 //    freopen("in.txt","r",stdin)    ;
 95
 96     n=read(),m=read();
 97     char ooo=getchar();int len=0;
 98     while(ooo<'a'||ooo>'z')ooo=getchar();
 99     while(ooo>='a'&&ooo<='z'){a[++len]=ooo-'a'+1;ooo=getchar();}
100     build(1,n,1);
101     int x,l,r;
102     for(register int i=1;i<=m;++i)
103     {
104         l=read(),r=read(),x=read();
105         work(x,l,r);
106     }
107     dfs(1);
108     for(int i=1;i<=n;i++)
109         putchar(sum(yz[i])+'a'-1);
110     puts("");
111 }
112 inline int read()
113 {
114     int s=0;char a=getchar();
115     while(a<'0'||a>'9')a=getchar();
116     while(a>='0'&&a<='9'){s=s*10+a-'0';a=getchar();}
117     return s;
118 }

View Code

转载于:https://www.cnblogs.com/Al-Ca/p/11286365.html

HZOJ string相关推荐

  1. Java知识——精华总结

    Java知识--精华总结 一.java概述与基础知识 1.何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 为了使计算机能够理解人的意图,人类就必须 ...

  2. mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string

    mybatis查询报错: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from strin ...

  3. Go 学习笔记(60)— Go 第三方库之 go-redis(初始化 redis、操作 string、操作 list、操作 set、操作 hset)

    1. 第三方库 go-redis 因为 Go 标准库中是没提供 redis 的库,所以我们选择用 go-redis 这个第三方库.源码地址为 https://github.com/go-redis/r ...

  4. Redis 笔记(03)— string类型(设置key、获取key、设置过期时间、批量设置获取key、对key进行加减、对key值进行追加、获取value子串)

    字符串 string 是 Redis 最简单的数据结构.Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据.不同类型的数据结构的 ...

  5. python中的raw string的使用

    背景 我们经常需要使用raw string,在应用过程中,比如要使字符串中带一些转义字符或者其他的一些符号,我们就需要保持我们的字符成为raw string. 实例 输入 s = 'fadfafa\n ...

  6. Java中如何实现Date与String之间的数据类型转换

    String 数据类型转换成 Date String inputDate = "2021-04-11";Date outputDate = null;SimpleDateForma ...

  7. C++ string字符串的比较是否相等

    C++ string字符串的比较是否相等 可以使用compare 也可以使用"==" 1 使用比较运算符 == #include <iostream> #include ...

  8. python string 转bytes 以及bytes 转string

    string转 bytes 使用 encode str_a = "Python" str_bytes = str_a.encode() # encode默认编码方式是utf-8 所 ...

  9. TypeError: string argument without an encoding

    这个错误是把string 类型转byte类型的时候出现的问题 下面就会报错 print(bytes(str_a)) 修改为如下就好了 print(bytes(str_a.encode())) 或者就不 ...

最新文章

  1. rancher的微服务运维
  2. Docker部署微服务详解
  3. 为什么学Python
  4. 华强北耳机芯片检测软件_关于华强北耳机air pods pro
  5. latex 插入表格_【2020.11.30】IEEE trans英文latex写作心得和学习历程
  6. VS2015+OpenCV3.4.2+Win10+简单调用摄像头
  7. cadence 原理图orcad使用总结
  8. String类常用方法
  9. 练习4.4 萨提亚冰山理论应用
  10. matlab中lab颜色空间,使用Matlab绘制图像的rgb颜色空间和Lab颜色空间分量图和分量直方图...
  11. Proxool - 快速入門
  12. PM2.5传感器通过树莓派推送到ThingsPanel
  13. 计算机屏幕关机按钮没有了怎么办,电脑每次关机图标不见了怎么办啊
  14. 线程池:4个方法,7个参数,4种拒绝策略
  15. 自动化之python基础,0基础手把手教学,最细的教程通俗易懂
  16. [转]WScript.Shell
  17. 非线性流形学习技术_非技术人员可以学习的100件事
  18. 将Excel中的两列或多列数据汇总到一列
  19. MIT6.830-2022-lab2实验思路详细讲解
  20. 趣图:IT培训出来找工作

热门文章

  1. 动态库和静态库的创建
  2. 解决chrome 很卡的问题
  3. 语义化,让你的网页更好的被搜索引擎理解
  4. 基于maven的ssh框架一步一步搭建(一)
  5. Oracle 11g 卸载
  6. ocp 042 第十一章:管理oracle网络配置
  7. 计算机的起源英语作文,冰箱的起源英语作文
  8. 推荐算法实现之BMF(pymc3+MovieLen)
  9. 【正一专栏】故意豪宅纵火的保姆会判死刑吗?
  10. AES加密解密算法Java实现