HZOJ string
正解炸了……
考试的时候想到了正解,非常高兴的打出来了线段树,又调了好长时间,对拍了一下发现除了非常大的点跑的有点慢外其他还行。因为复杂度算着有点高……
最后正解死于常数太大……旁边的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的更多相关文章
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- js报错: Uncaught RangeError: Invalid string length
在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...
- c# 字符串连接使用“+”和string.format格式化两种方式
参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...
- 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...
- JavaScript中String对象的方法介绍
1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...
- 在多线程编程中lock(string){...}隐藏的机关
常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...
随机推荐
- @at-root和#{&}结合
Sass有脚本模式#{},他和&不同之处是,&只用作选择器,它只能出现在一个复合的开始选择器,类似于一个类型选择器,如a或者h1.但#{}他表示的是一个插值,它可以用在任何地方.同样的 ...
- IO流8 --- 使用FileReader和FileWriter实现文本文件的复制 --- 技术搬运工(尚硅谷)
@Test public void test4(){ FileReader fr = null; FileWriter fw = null; try { fr = new FileReader(&qu ...
- SpringBooot-基础<2>-POM.xml配置
SpringBooot-基础<2>-POM.xml配置 项目创建完成后,需要配置pom.xml文件. pom.xml里面的配置,按需进行添加,这里提供一份参考,后面做笔记会都用到. < ...
- MobaXterm实时查看Linux服务器上的日志
一.工具 MobaXterm介绍 https://blog.csdn.net/juyin2015/article/details/79056687/ 1.,点击Session 输入服务器IP.用户名 ...
- django中模型
一.django需要使用数据库,则需要安装对应的驱动,比如mysql,则需要安装mysqlclient驱动: pip install mysqlclient 二.在settings.py文件中配置数据 ...
- 编译libusb库
之前需要安装依赖库 : libudevautomakeautoconflibtool ./bootstrap.sh ./configure --with-pic --prefix=/home/libu ...
- PHP核心编程--站内搜索
一. 站内搜索 前台页面: 在index.php页面中添加一个表单,输入搜索框 后台页面: 将index.php另存为search.php 对于搜索的 分页关键代码: 高亮关键字 相关 ...
- 一.JDBC学习入门
一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...
- Directx11教程(62) tessellation学习(4)
原文:Directx11教程(62) tessellation学习(4) 现在看看四边形在不同tess factor时,四边形细分的细节,下图是tess factor1-8时候的细分.te ...
- SDUT-3373_数据结构实验之查找一:二叉排序树
数据结构实验之查找一:二叉排序树 Time Limit: 400 ms Memory Limit: 65536 KiB Problem Description 对应给定的一个序列可以唯一确定一棵二叉排 ...