CF558E A Simple Task 线段树
题解:
这种题之前做过一个类似的题目,也是关于选择区间然后给区间进行排序。
这种题用线段树把排序转换成区间修改区间求和即可。
类似的题目: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 线段树相关推荐
- codeforces 558E A Simple Task 线段树
题目链接 题意较为简单. 思路: 由于仅仅有26个字母,所以用26棵线段树维护就好了,比較easy. #include <iostream> #include <string> ...
- HDU-3974 Assign the task 线段树 或 直接模拟多叉树 或 并查集 (三种方法)
题目大意 t 组数据(t<=10),每组第一行一个 n 表示 n 个员工(n<=5e4),接下来 n-1 行,每行两个整数 u,v 表示 v 是 u 的上司 然后一行 m 表示有 m 个操 ...
- HDU - 3974 Assign the task (线段树 + dfs序)
HDU - 3974 题意:有个公司有一些关系,每个人(除了boss)都有且仅有一个上司,这就是一棵树的关系,然后会有一些操作,C i,询问第i个人现在的任务,T x y,把y任务给x, 给x相当于给 ...
- 【做题记录】区间排序—线段树
1. CF558E A Simple Task 题意: 给定由小写字母组成的字符串 \(s\) 每一次操作如下: \(opt=0\) :将 \([l,r]\) 降序排序 \(opt=1\) :将 \( ...
- Codeforces J. A Simple Task(多棵线段树)
题目描述: Description This task is very simple. Given a string S of length n and q queries each query is ...
- CF-558E(E. A Simple Task)
CF-558E(E. A Simple Task) 题目链接 题意 长度为NNN的串,给qqq次修改每次修改给出一个区间[L,R][L,R][L,R],你需要将区间的字符按照升序或降序排列.输出qqq ...
- Assign the task HDU - 3974(线段树+dfs建树+单点查询+区间修改)
题意: 染色问题:给一个固定结构的树,现在有两个操作: (1) y 将结点x及其所有后代结点染成颜色y: (2)查询结点x当前的颜色. 其实就是区间染色问题,不过需要dfs预处理, 题目: There ...
- 【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 ...
- 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 ...
最新文章
- SLA 99.99%以上!饿了么实时计算平台3年演进历程
- Postman请求linux服务器报错:503Forwarding failure,由于服务器端口未开放;服务器端口开放与关闭
- 如何在Oracle11中配置st_shapelib
- 【汇总】涉及iOSiPhone开发相关文章汇总
- Android各种报错问题汇总
- View的Measure流程总结
- Java获取当前线程的名字以及为线程命名
- MySQL---第07章_单行函数
- mongodb的id的唯一性_mongodb中的objectid是collection中唯一,还是全db唯一,还是全宇宙唯一?...
- linux mint 18.3 内核,Linux Mint 18.3 “Sylvia” Cinnamon正式发布上线
- Ubuntu10.04制作官方源镜像以及搭建本地源
- 前端笔记-echarts加载bmap地图
- Nginx 反向代理解决跨域问题
- 论文笔记--跨模态间的人脸与人名对齐方法研究-2012
- [转]浅谈Normalize.css
- Elasticsearch 监控和优化(持续)
- (转)Spring实现IoC的多种方式
- 带你看JDK源码之HashMap
- android彻底退出应用_Android完全退出应用程序的方法
- 企业内网DNS搭建,SmartDNS,网站访问加速,解决dns污染等问题