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( ...
随机推荐
- Django REST Framework之认证组件
什么是认证 认证即需要知道是谁在访问服务器,需要有一个合法身份.认证的方式可以有很多种,例如session+cookie.token等,这里以token为例.如果请求中没有token,我们认为这是未登 ...
- linux学习 网络系统&文件查找
被用来配置和操作网络系统的命令数目非常巨大,这里仅仅介绍一些经常会使用的 这一章会介绍ssh远程登录程序哦 ping 命令(掠过) traceroute 会显示主机到指定的主机要经过的跳数的网络流量列 ...
- 2019.9.28 csp-s模拟测试54 反思总结
咕咕咕的冲动如此强烈x T1x: 看完题目想了想,感觉把gcd不为1的强行放在一组,看作一个连通块,最后考虑连通块之间的组合方式就可以了. 然后维护这个连通块可以写并查集可以连边跑dfs怎么着都行… ...
- 2018-8-10-如何移动-nuget-缓存文件夹
title author date CreateTime categories 如何移动 nuget 缓存文件夹 lindexi 2018-08-10 19:16:51 +0800 2018-2-13 ...
- select @@identity的用法 转
用select @@identity得到上一次插入记录时自动产生的ID 如果你使用存储过程的话,将非常简单,代码如下:SET @NewID=@@IDENTITY 说明: 在一条 INSERT.SELE ...
- CentOS7安装步骤
CentOS7安装详解 本文基于vmware workstations进行CentOS7安装过程展示,关于vmware workstations安装配置本人这里不再介绍,基本过程相当于window ...
- 2018-8-10-C#-不能用于文件名的字符
title author date CreateTime categories C# 不能用于文件名的字符 lindexi 2018-08-10 19:16:52 +0800 2018-02-22 1 ...
- VisualTreeHelper使用——使用BFS实现高效率的视觉对象搜索
BFS,即广度优先搜索,是一种典型的图论算法.BFS算法与DFS(深度优先搜索)算法相对应,都是寻找图论中寻路的常用算法,两者的实现各有优点. 其中DFS算法常用递归实现,也就是常见的一条路找到黑再找 ...
- Linux常用命令5 用户管理命令
1.用户管理命令:useradd 所在路径:/usr/bin/useradd 执行权限:root 语法:useradd 用户名 功能描述:添加新用户 例如:useradd hzw userd ...
- epiinfo是美国CDC开发维护的流行病学数据录入和分析软件,在DOS时代占主流,随着Windows的普及用的人越来越少了,epiinfo重新开发Windows版本后,体积庞大且不好用。在数据录入方面已被EpiData取代,不过epiinfo的分析模块,比如地理信息系统某些情况下还是挺有用的。
Manual: https://www.cdc.gov/epiinfo/support/userguide.html https://en.wikipedia.org/wiki/Epi_Info 教程 ...