题解:
这种题之前做过一个类似的题目,也是关于选择区间然后给区间进行排序。
这种题用线段树把排序转换成区间修改区间求和即可。
类似的题目:https://vjudge.net/problem/HDU-5649

首先我们看到这个题是针对于字母进行排序的,区间操作很像线段树,那么如何把他转换成线段树呢?
我们考虑他只有26个字母,那么我们是否可以转换成维护这26个字母呢?
对于每一段区间,我们查询每个字母出现的个数。
然后按照题目要求(升序还是降序)然后从l到r依次填从小到大填入字母即可。
转换为了区间修改和区间查询操作。

#include <bits/stdc++.h>//#define int long long
#define ll long long
const int maxn=2e5+10;
using namespace std;
const int p=1e9+10;int sum[maxn*4][30];
int a[maxn];
int lazy[maxn];
void push_up(int node){for(int i=1;i<=26;i++){sum[node][i]=sum[node*2][i]+sum[node*2+1][i];}
}void build(int node,int start,int ends){if(start==ends){sum[node][a[start]]++;return ;}int mid=(start+ends)/2;build(node*2,start,mid);build(node*2+1,mid+1,ends);push_up(node);
}void push_down(int node,int start,int ends){if(lazy[node]){for(int i=0;i<=26;i++){sum[node*2][i]=sum[node*2+1][i]=0;}int mid=(start+ends)/2;sum[node*2][lazy[node]]=mid-start+1;sum[node*2+1][lazy[node]]=ends-mid;lazy[node*2]=lazy[node*2+1]=lazy[node];}lazy[node]=0;
}void update(int node,int start,int ends,int l,int r,int val){if(start>=l&&ends<=r){lazy[node]=val;for(int i=1;i<=26;i++) sum[node][i]=0;sum[node][val]=ends-start+1;return ;}push_down(node,start,ends);int mid=(start+ends)/2;if(l<=mid) update(node*2,start,mid,l,r,val);if(mid<r) update(node*2+1,mid+1,ends,l,r,val);push_up(node);
}
int ans[30];
void query(int node,int start,int ends,int l,int r){if(start>=l&&ends<=r){for(int i=1;i<=26;i++){ans[i]+=sum[node][i];}return ;}int mid=(start+ends)/2;push_down(node,start,ends);if(l<=mid) query(node*2,start,mid,l,r);if(mid<r) query(node*2+1,mid+1,ends,l,r);
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,q;cin>>n>>q;string s;cin>>s;for(int i=0;i<n;i++){a[i+1]=s[i]-'a'+1;}build(1,1,n);query(1,1,n,2,n);while(q--){int l,r,opt;cin>>l>>r>>opt;memset(ans,0,sizeof ans);if(opt==1){query(1,1,n,l,r);int pos=l;for(int i=1;i<=26;i++){if(ans[i]){update(1,1,n,pos,pos+ans[i]-1,i);pos=pos+ans[i];}}}else{query(1,1,n,l,r);int pos=l;for(int i=26;i>=1;i--){if(ans[i]){update(1,1,n,pos,pos+ans[i]-1,i);pos=pos+ans[i];}}}}memset(ans,0,sizeof ans);for(int i=1;i<=n;i++){query(1,1,n,i,i);for(int i=1;i<=26;i++){if(ans[i]){cout<<(char)(i+'a'-1);ans[i]--;}}}
}

CF558E A Simple Task 线段树相关推荐

  1. codeforces 558E A Simple Task 线段树

    题目链接 题意较为简单. 思路: 由于仅仅有26个字母,所以用26棵线段树维护就好了,比較easy. #include <iostream> #include <string> ...

  2. HDU-3974 Assign the task 线段树 或 直接模拟多叉树 或 并查集 (三种方法)

    题目大意 t 组数据(t<=10),每组第一行一个 n 表示 n 个员工(n<=5e4),接下来 n-1 行,每行两个整数 u,v 表示 v 是 u 的上司 然后一行 m 表示有 m 个操 ...

  3. HDU - 3974 Assign the task (线段树 + dfs序)

    HDU - 3974 题意:有个公司有一些关系,每个人(除了boss)都有且仅有一个上司,这就是一棵树的关系,然后会有一些操作,C i,询问第i个人现在的任务,T x y,把y任务给x, 给x相当于给 ...

  4. 【做题记录】区间排序—线段树

    1. CF558E A Simple Task 题意: 给定由小写字母组成的字符串 \(s\) 每一次操作如下: \(opt=0\) :将 \([l,r]\) 降序排序 \(opt=1\) :将 \( ...

  5. Codeforces J. A Simple Task(多棵线段树)

    题目描述: Description This task is very simple. Given a string S of length n and q queries each query is ...

  6. CF-558E(E. A Simple Task)

    CF-558E(E. A Simple Task) 题目链接 题意 长度为NNN的串,给qqq次修改每次修改给出一个区间[L,R][L,R][L,R],你需要将区间的字符按照升序或降序排列.输出qqq ...

  7. Assign the task HDU - 3974(线段树+dfs建树+单点查询+区间修改)

    题意: 染色问题:给一个固定结构的树,现在有两个操作: (1) y 将结点x及其所有后代结点染成颜色y: (2)查询结点x当前的颜色. 其实就是区间染色问题,不过需要dfs预处理, 题目: There ...

  8. 【HDU - 3974】 Assign the task (dfs序 + 线段树维护 区间更新+ 单点查询)

    题干: There is a company that has N employees(numbered from 1 to N),every employee in the company has ...

  9. HDU 3974 Assign the task(DFS序+线段树单点查询,区间修改)

    描述 There is a company that has N employees(numbered from 1 to N),every employee in the company has a ...

最新文章

  1. SLA 99.99%以上!饿了么实时计算平台3年演进历程
  2. Postman请求linux服务器报错:503Forwarding failure,由于服务器端口未开放;服务器端口开放与关闭
  3. 如何在Oracle11中配置st_shapelib
  4. 【汇总】涉及iOSiPhone开发相关文章汇总
  5. Android各种报错问题汇总
  6. View的Measure流程总结
  7. Java获取当前线程的名字以及为线程命名
  8. MySQL---第07章_单行函数
  9. mongodb的id的唯一性_mongodb中的objectid是collection中唯一,还是全db唯一,还是全宇宙唯一?...
  10. linux mint 18.3 内核,Linux Mint 18.3 “Sylvia” Cinnamon正式发布上线
  11. Ubuntu10.04制作官方源镜像以及搭建本地源
  12. 前端笔记-echarts加载bmap地图
  13. Nginx 反向代理解决跨域问题
  14. 论文笔记--跨模态间的人脸与人名对齐方法研究-2012
  15. [转]浅谈Normalize.css
  16. Elasticsearch 监控和优化(持续)
  17. (转)Spring实现IoC的多种方式
  18. 带你看JDK源码之HashMap
  19. android彻底退出应用_Android完全退出应用程序的方法
  20. 企业内网DNS搭建,SmartDNS,网站访问加速,解决dns污染等问题

热门文章

  1. 图像滤波常用算法实现及原理解析
  2. 算法工程师面试必考项:二叉树
  3. 快速指南:使用OpenCV预处理神经网络中的面部图像
  4. 综述 | 基于深度学习的目标检测算法
  5. 墙裂建议收藏,100道Python练手题目
  6. 【OpenCV 4开发详解】轮廓外接多边形
  7. 多媒体指令(灰度像素最大值)
  8. 基于HTTP协议的几种实时数据获取技术
  9. IE6 IE7 不支持 JSON
  10. HDFS-Shell