正解炸了……

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

最后正解死于常数太大……旁边的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掉。

 #include<iostream>
#include<cstring>
#include<cstdio>
#define MAXN 100010
using namespace std;
struct tree
{
int l,r,sum;
#define l(x) tr[x].l
#define r(x) tr[x].r
#define ls(x) (x*2)
#define rs(x) ((ls(x))+1)
#define sum(x) tr[x].sum
}tr[MAXN*];
char a[MAXN];
int n,m,yz[MAXN];
void pushup(int x)
{
if(l(x)==r(x))return;
sum(x)=(sum(ls(x))==sum(rs(x))?sum(ls(x)):);
}
void build(int l,int r,int x)
{
l(x)=l,r(x)=r;
if(l==r){sum(x)=a[l];yz[l]=x;return;}
int mid=(l+r)>>;
build(l,mid,ls(x));
build(mid+,r,rs(x));
pushup(x);
}
void down(int x)
{
if(!sum(x))return;
if(l(x)!=r(x))sum(ls(x))=sum(rs(x))=sum(x);
}
void add(int l,int r,int x,int data)
{
if((l(x)>=l&&r(x)<=r)||sum(x)==data)
{sum(x)=data;down(x);return;}
down(x);
int mid=(l(x)+r(x))>>;
if(l<=mid)add(l,r,ls(x),data);
if(r>mid) add(l,r,rs(x),data);
pushup(x);
}
int t[];
void ask(int l,int r,int x)
{
down(x);
if(l>r(x)||r<l(x))return;
if(l<=l(x)&&r>=r(x)&&sum(x))
{
t[sum(x)]+=r(x)-l(x)+;
return;
}
down(x);
int mid=(l(x)+r(x))>>;
if(l<=mid)ask(l,r,ls(x));
if(r>mid) ask(l,r,rs(x));
}
void work(int x,int l,int r)
{
memset(t,,sizeof(t));
ask(l,r,);
int tl=l;
if(x==)
{
for(register int i=;i<=;i++)
if(t[i])
{
add(tl,tl+t[i]-,,i);
tl=tl+t[i];
}
}
else
{
for(register int i=;i>=;i--)
if(t[i])
{
add(tl,tl+t[i]-,,i);
tl=tl+t[i];
}
}
}
void dfs(int x)
{
down(x);
if(l(x)==r(x))return;
dfs(ls(x)),dfs(rs(x));
}
inline int read();
signed main()
{
// freopen("in.txt","r",stdin) ; n=read(),m=read();
char ooo=getchar();int len=;
while(ooo<'a'||ooo>'z')ooo=getchar();
while(ooo>='a'&&ooo<='z'){a[++len]=ooo-'a'+;ooo=getchar();}
build(,n,);
int x,l,r;
for(register int i=;i<=m;++i)
{
l=read(),r=read(),x=read();
work(x,l,r);
}
dfs();
for(int i=;i<=n;i++)
putchar(sum(yz[i])+'a'-);
puts("");
}
inline int read()
{
int s=;char a=getchar();
while(a<''||a>'')a=getchar();
while(a>=''&&a<=''){s=s*+a-'';a=getchar();}
return s;
}

HZOJ string的更多相关文章

  1. 透过WinDBG的视角看String

    摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...

  2. JavaScript String对象

    本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...

  3. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  4. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

  5. js报错: Uncaught RangeError: Invalid string length

    在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...

  6. c# 字符串连接使用“+”和string.format格式化两种方式

    参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...

  7. 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...

  8. JavaScript中String对象的方法介绍

    1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...

  9. 在多线程编程中lock(string){...}隐藏的机关

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...

随机推荐

  1. 关于github 代码管理,协作开发

    公司要用github 进行项目管理,  了解了一下github相关权限管理. 并做笔记如下: 个人账户可以建立公有/私有  repository ,  公有的全天下的人都能看到,私有的全天下人都看不到 ...

  2. Redis分布式锁的实现及注意事项

    一.前言 分布式锁一般有三种实现方式: 1. 数据库乐观锁: 2. 基于Redis的分布式锁: 3. 基于ZooKeeper的分布式锁. 本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上 ...

  3. CentOS 6.8 Java 环境搭建

      1.搜索 Java 1.7 64 2.下载 文件 3.Xshell 安装lrzsz 4.选择路径 5.使用 rz 命令选择上传 6.打开 /etc/profile vim /etc/profile ...

  4. NKOJ1469 通向自由的钥匙

    P1469通向自由的钥匙   时间限制 : 10000 MS   空间限制 : 65536 KB 问题描述 通向自由的钥匙被放n个房间里,这n个房间由n-1条走廊连接.但是每个房间里都有特别 的保护魔 ...

  5. Laravel5.8 使用结巴中文分词的简单教程_php中文分词

    1.首先用composer加载结巴中文分词-PHP composer require fukuball/jieba-php:dev-master 2.在composer.json 中引用, 让他自动加 ...

  6. 学习JDK1.8集合源码之--LinkedHashSet

    1. LinkedHashSet简介 LinkedHashSet继承自HashSet,故拥有HashSet的全部API,LinkedHashSet内部实现简单,核心参数和方法都继承自HashSet,只 ...

  7. 深入浅出Cocoa之类与对象【转】

    最近打算写一些ObjC中比较底层的东西,尤其是 runtime 相关的.苹果已经将 ObjC runtime 代码开源了,我们可以从:http://opensource.apple.com/sourc ...

  8. LintCode_111 爬楼梯

    题目 假设你正在爬楼梯,需要n步你才能到达顶部.但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? 比如n=3,中不同的方法 返回 3 1 2 3 5 8 13... step[2] = ...

  9. php Laravel Thrift使用TMultiplexedProcessor复用端口模式

    thrift的使用中一般是一个Server对应一个Processor和一个Transport,如果有多个服务的话,那必须要启动多个Server,占用多个端口,这种方式显然不是我们想要的,所以thrif ...

  10. django查看数据库

    #views import pymysql def get_date(request): conn = pymysql.connect( host='localhost', port=3306, us ...