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( ...
随机推荐
- css 始终让图片占满自适应盒子(图片不失真)
要去上班了,时间比较紧,先把代码粘出来,原理慢慢讲 我来了,今天是农历七月八日,昨天是七夕,不知道为什么,突然通知放假半天(嘎嘎),好吧,没什么!!!走到半路的我看到通知,立马撤了.正好回来把这个原理 ...
- 为啥Spring和Spring MVC包扫描要分开
开始学习springmvc各种小白问题 根据例子配置了spring扫描包,但是一直提示404错误,经过大量搜索,发现,扫描包的配置应该写在springmvc的配置文件中,而不是springmvc 配置 ...
- IO流2 --- File类的常用方法1 --- 技术搬运工(尚硅谷)
File类的获取功能 @Test public void test2(){ File file1 = new File("hello.txt"); File file2 = new ...
- Python科学计算生态圈--Pandas
- VMware ESXi 6.7服务器设置开机自动启动虚拟机
VMware ESXi 6.7服务器设置开机自动启动虚拟机,具体操作步骤如下 1.登陆到VMware ESXi 6.7 web 界面 2.导航器-->主机-->管理 将自动启动修改为 ...
- vue 项目重定向时需要传参数
1.在项目首页路由因需要进行传参数,例如需要重定向到:path: "/index?from=0" 2.重定向时写法如下: redirect: {path: '/index',que ...
- 使用log4j打印日志
在项目中我们必不可少需要打印日志,通过日志我们可以查看系统的运行状态是否正常,当程序出现异常的时候,我们也可以通过查看日志来定位问题的位置,给程序员的工作带来了极大的便利. 以下这边博客的内容是我从一 ...
- arcgis几何对象
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 手机端点击键盘无法获取keyCode值的部分时隐藏键盘并执行事件
用计时器监视window.innerHeight高度改变来判断.触发键盘其他地方也有事件反应 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...
- loadrunner分析之-网页、网络、资源分析
在Web Page Diagnostics(网页分析)中当在场景中打开Diagnostics菜单下的Web Page Diagnostics功能,就能得到网页分析组图.通过这个图,可以对事务的组成进行 ...