51nod1485 字母排序
2024-08-30 18:40:57
【题解】
开26棵线段数,记录区间内每种字母的出现次数,修改的时候就用区间设置为一个数操作即可。同时也有平衡树做
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
#define rg register
#define N 200010
#define ls (u<<1)
#define rs (u<<1|1)
#define mid ((a[u].l+a[u].r)>>1)
using namespace std;
int n,m,opt,l,r,q[];
struct tree{
int l,r,cnt[],set;
}a[N<<];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
void build(int u,int l,int r){
a[u].l=l; a[u].r=r; a[u].set=-;
if(l<r){
build(ls,l,mid); build(rs,mid+,r);
for(rg int i=;i<;i++) a[u].cnt[i]=a[ls].cnt[i]+a[rs].cnt[i];
}
else a[u].cnt[getchar()-'a']++;
}
inline void pushdown(int u){
if(a[u].set==-) return; int set=a[u].set;
for(rg int i=;i<;i++) a[ls].cnt[i]=a[rs].cnt[i]=;
a[ls].cnt[a[ls].set=set]=(a[ls].r-a[ls].l+);
a[rs].cnt[a[rs].set=set]=(a[rs].r-a[rs].l+);
a[u].set=-;
}
void update(int u,int l,int r,int set){
if(l<=a[u].l&&a[u].r<=r){
for(rg int i=;i<;i++) a[u].cnt[i]=;
a[u].cnt[a[u].set=set]=(a[u].r-a[u].l+);
return;
}
pushdown(u);
if(l<=mid) update(ls,l,r,set);
if(r>mid) update(rs,l,r,set);
for(rg int i=;i<;i++) a[u].cnt[i]=a[ls].cnt[i]+a[rs].cnt[i];
}
void query(int u,int l,int r){
if(l<=a[u].l&&a[u].r<=r){
for(rg int i=;i<;i++) q[i]+=a[u].cnt[i];
return;
}
pushdown(u);
if(l<=mid) query(ls,l,r);
if(r>mid) query(rs,l,r);
}
void out(int u,int pos){
if(a[u].l==a[u].r) for(rg int i=;i<;i++)if(a[u].cnt[i]){putchar(i+'a'); return;}
pushdown(u);
if(pos<=mid) out(ls,pos); else out(rs,pos);
}
int main(){
n=read(); m=read(); build(,,n);
while(m--){
memset(q,,sizeof(q));
l=read(); r=read(); opt=read();
query(,l,r); int now=l;
if(opt==){
for(rg int i=;i<;i++)if(q[i]) update(,now,now+q[i]-,i),now+=q[i];
}
else{
for(rg int i=;i>=;i--)if(q[i]) update(,now,now+q[i]-,i),now+=q[i];
}
memset(q,,sizeof(q));
}
for(rg int i=;i<=n;i++) out(,i);
return ;
}
法。
最新文章
- visual studio 2015 + Cordova 开发环境搭建
- [转]C#编程总结(三)线程同步
- 关于MYSQL中like 检索汉字问题。
- tiny4412的中断资源连接关系示意图
- Mac OS 使用Git
- VMware虚拟机升级过程中遇到的一点问题
- js如何判断一个对象是不是Array
- PHP中用PDO方法打开连接关闭mysql数据库
- [ACM] POJ 3061 Subsequence (仿真足)
- 《剑指offer》— JavaScript(17)树的子结构
- C#微信公众号/订阅号开发 接口源码
- 执行查询&ldquo;BACKUP LOG [XXX] TO DISK = N'F:\\BackData\\事务日至备份\\...&rdquo;失败,错误如下:&ldquo;无法执行 BACKUP LOG,因为当前没有数据库备份。 BACKUP LOG 正在异常终止。
- JDBC访问及操作SQLite数据库
- Scrapy实战篇(八)之爬取教育部高校名单抓取和分析
- Html的简单学习笔记
- PDF如何设置书签,怎么在PDF上添加书签
- pymysql 解决 sql 注入问题
- 7.2内存管理-ARC
- 对 Phantomjs / CasperJS 进行远程调试
- 浏览器中回车(Enter)和刷新的区别是什么?[转载]