codeforces 558E A Simple Task 线段树
题意较为简单。
思路:
由于仅仅有26个字母,所以用26棵线段树维护就好了,比較easy。
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <cstdio>
#include <map>
#include <queue>
#include <algorithm>
#include <stack>
#include <cstring>
#include <cmath>
#include <set>
#include <vector>
using namespace std;
template <class T>
inline bool rd(T &ret) {
char c; int sgn;
if (c = getchar(), c == EOF) return 0;
while (c != '-' && (c<'0' || c>'9')) c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return 1;
}
template <class T>
inline void pt(T x) {
if (x <0) {
putchar('-');
x = -x;
}
if (x>9) pt(x / 10);
putchar(x % 10 + '0');
}
typedef long long ll;
typedef pair<ll, ll> pii;
const int N = 1e5 + 100;
#define lson (id<<1)
#define rson (id<<1|1)
#define L(x) tree[x].l
#define R(x) tree[x].r
#define Hav(x) tree[x].hav
#define Siz(x) tree[x].siz
#define Lazy(x) tree[x].lazy
struct Tree {
struct Node {
int l, r, siz;//siz表示区间长度
int hav;//hav表示这个区间的和
int lazy;//lazy为2表示清空区间 lazy为1表示把区间都变为1
}tree[N << 2];
void build(int l, int r, int id) {
L(id) = l; R(id) = r; Siz(id) = r - l + 1;
Hav(id) = Lazy(id) = 0;
if (l == r)return;
int mid = (l + r) >> 1;
build(l, mid, lson); build(mid + 1, r, rson);
}
void Down(int id) {
if (Lazy(id) == 1) {
Lazy(id) = 0;
Hav(lson) = Siz(lson); Hav(rson) = Siz(rson);
Lazy(lson) = Lazy(rson) = 1;
}
else if (Lazy(id) == 2) {
Lazy(id) = 0;
Hav(lson) = Hav(rson) = 0;
Lazy(lson) = Lazy(rson) = 2;
}
}
void Up(int id) {
Hav(id) = Hav(lson) + Hav(rson);
}
void updata(int l, int r, int val, int id) {
if (l == L(id) && R(id) == r) {
if (val == 1)
Hav(id) = Siz(id);
else Hav(id) = 0;
Lazy(id) = val;
return;
}
Down(id);
int mid = (L(id) + R(id)) >> 1;
if (r <= mid)updata(l, r, val, lson);
else if (mid < l)updata(l, r, val, rson);
else {
updata(l, mid, val, lson);
updata(mid + 1, r, val, rson);
}
Up(id);
}
int query(int l, int r, int id) {
if (l == L(id) && R(id) == r) {
return Hav(id);
}
Down(id);
int mid = (L(id) + R(id)) >> 1, ans = 0;
if (r <= mid)ans = query(l, r, lson);
else if (mid < l)ans = query(l, r, rson);
else {
ans = query(l, mid, lson) + query(mid + 1, r, rson);
}
Up(id);
return ans;
}
};
Tree alph[26];
int n, q;
char s[N];
int sum[26];
int main() {
rd(n); rd(q);
for (int i = 0; i < 26; i++)alph[i].build(1, n, 1);
scanf("%s", s + 1);
for (int i = 1; i <= n; i++) {
alph[s[i] - 'a'].updata(i, i, 1, 1);
}
while (q--) {
int l, r, in;
rd(l); rd(r); rd(in);
memset(sum, 0, sizeof sum);
for (int i = 0; i < 26; i++)
{
sum[i] += alph[i].query(l, r, 1);
alph[i].updata(l, r, 2, 1);
}
int tim = 26, i;
if (in)i = 0; else i = 25, in = -1;
for (;tim--; i += in) {
if (sum[i] == 0)continue;
alph[i].updata(l, l + sum[i] - 1, 1, 1);
l += sum[i];
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < 26; j++)
if (alph[j].query(i, i, 1))
{
putchar(j + 'a'); break;
}
}
return 0;
}
codeforces 558E A Simple Task 线段树的更多相关文章
- CodeForces 588E A Simple Task(线段树)
This task is very simple. Given a string S of length n and q queries each query is on the format i j ...
- Codeforces 588E. A Simple Task (线段树+计数排序思想)
题目链接:http://codeforces.com/contest/558/problem/E 题意:有一串字符串,有两个操作:1操作是将l到r的字符串升序排序,0操作是降序排序. 题解:建立26棵 ...
- 计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task
E. A Simple Task Problem's Link: http://codeforces.com/problemset/problem/558/E Mean: 给定一个字符串,有q次操作, ...
- Codeforces 558E A Simple Task (计数排序&&线段树优化)
题目链接:http://codeforces.com/contest/558/problem/E E. A Simple Task time limit per test5 seconds memor ...
- Codeforces 558E A Simple Task(权值线段树)
题目链接 A Simple Task 题意 给出一个小写字母序列和若干操作.每个操作为对给定区间进行升序排序或降序排序. 考虑权值线段树. 建立26棵权值线段树.每次操作的时候先把26棵线段树上的 ...
- Codeforces 558E A Simple Task(计数排序+线段树优化)
http://codeforces.com/problemset/problem/558/E Examples input 1 abacdabcda output 1 cbcaaaabdd input ...
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树
E. A Simple Task 题目连接: http://www.codeforces.com/contest/558/problem/E Description This task is very ...
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树+计数排序
题目链接: http://codeforces.com/problemset/problem/558/E E. A Simple Task time limit per test5 secondsme ...
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记
E. A Simple Task time limit per test5 seconds memory limit per test512 megabytes inputstandard input ...
随机推荐
- React 第一天
第一天 从webpack到babel再到React.js Vue是如何实现组件化的: 通过.vue文件,来创建对应的组件: ·template 结构 ·script 行为 ·style 样式 Reac ...
- 【Paper Reading】Bayesian Face Sketch Synthesis
Contribution: 1) Systematic interpretation to existing face sketch synthesis methods. 2) Bayesian fa ...
- 紫书 例题11-11 UVa 12661 (dihkstra变形)
这道题主要比较权值的时候要改变一下,其他地方基本一样. 比较权值的时候要考虑边的时间与a, b 可以设相对于当前边的时间now, 则now = d[u] % (a+b), 也就是当前这个边进行到整个a ...
- 紫书 习题 8-20 UVa 1620 (找规律+求逆序对)
这道题看了半天没看出什么规律, 然后看到别人的博客, 结论是当n为奇数且逆序数为奇数的时候 无解, 否则有解.但是没有给出证明, 在网上也找到详细的证明--我也不知道是为什么-- 求逆序对有两种方法, ...
- 现代C++
C++ 是世界上最常用的编程语言之一. 编写良好的 C++ 程序是快速.高效的. 该语言比其他语言更加灵活,因为你可以使用它来创建各种应用,包括有趣刺激的游戏.高性能科学软件.设备驱动程序.嵌入式程序 ...
- (三)ng-app的使用困惑和angularJS框架的自己主动载入
ng-app是angular的一个指令,代表一个angular应用(也叫模块).使用ng-app或ng-app=""来标记一个DOM结点.让框架会自己主动载入.也就是说,ng-ap ...
- 【Android】把外部文件拷贝的AVD安卓模拟器上的sdcard上,而且在AVD中浏览sdcard的文件
首先.实现这一切的大前提是.你的AVD安卓模拟器,在启动之前.有设置好sdcard的大小,例如以下图.同一时候,你的AVD安卓模拟器,要处于启动状态.否则无法运行例如以下的操作. 这里以<[An ...
- JavaSript之prototype属性
近期在JavaSript进行Array操作的时候发现没有删除节点的方法.而我要实现的效果须要不断调用删除节点的方法.查找了相关资料发现能够利用prototype属性给Array添加删除节点的方法.而且 ...
- 面试题:Student s = new Student();在内存中做了哪些事情?即创建一个对象做了哪些事情
lStudent s = new Student();在内存中做了哪些事情? •载入Student.class文件进内存(方法区) •在栈内存为s开辟空间 •在堆内存为学生对象开辟空间 •对学生对象的 ...
- Html学习(三) 分类学习
代码: <h1>这是一级分类吗</h1> <h2>这是二级分类吗</h2> <h3>这是三级分类吗 </h3> 效果: 介绍: ...