【题解】

  开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 ;
}

法。

最新文章

  1. visual studio 2015 + Cordova 开发环境搭建
  2. [转]C#编程总结(三)线程同步
  3. 关于MYSQL中like 检索汉字问题。
  4. tiny4412的中断资源连接关系示意图
  5. Mac OS 使用Git
  6. VMware虚拟机升级过程中遇到的一点问题
  7. js如何判断一个对象是不是Array
  8. PHP中用PDO方法打开连接关闭mysql数据库
  9. [ACM] POJ 3061 Subsequence (仿真足)
  10. 《剑指offer》— JavaScript(17)树的子结构
  11. C#微信公众号/订阅号开发 接口源码
  12. 执行查询&ldquo;BACKUP LOG [XXX] TO DISK = N'F:\\BackData\\事务日至备份\\...&rdquo;失败,错误如下:&ldquo;无法执行 BACKUP LOG,因为当前没有数据库备份。 BACKUP LOG 正在异常终止。
  13. JDBC访问及操作SQLite数据库
  14. Scrapy实战篇(八)之爬取教育部高校名单抓取和分析
  15. Html的简单学习笔记
  16. PDF如何设置书签,怎么在PDF上添加书签
  17. pymysql 解决 sql 注入问题
  18. 7.2内存管理-ARC
  19. 对 Phantomjs / CasperJS 进行远程调试
  20. 浏览器中回车(Enter)和刷新的区别是什么?[转载]

热门文章

  1. POJ3528 HDU3662 三维凸包模板
  2. JSP-Runoob:JSP 教程
  3. 数据读进set,进行后处理
  4. 测试神器Swagger的相关使用
  5. Springboot 三种拦截Rest API的方法-过滤器、拦截器、切片
  6. 源码阅读之ArrayList(JDK8)
  7. redis实际项目作用
  8. [Qt Creator 快速入门] 第4章 布局管理
  9. ACM_01背包(恰好装满)
  10. php pdo oracle