E. A Simple Task

这个题目的意思是 给你一个由小写字母组成的字符串,有两种操作

i j k 如果k==1 那么就是就把i 到 j 的这个区间非递减排序。

i j k如果k==2 那么就是把 i 到 j 这个区间非递增排序。

n 有 1e5  q(操作次数)  5e4

这个题目不会写,问别人的。

这个要建26棵线段树,首先对这个字符串进行预处理,把每一个位置放到每一个字母放到它的线段树对应的位置。

比如说 acbd     a应该放在第一棵树的1位置,c放到第三颗树,2的位置,b放到第二颗树的3号位置,以此类推。

这个是预处理,然后就是对于操作的写法。

每一个操作给你了一个区间,我们先计算这个区间的每一颗线段树的数量的字母数量,然后清空这个区间的每一颗线段树,

再给定区间进行更新。

知道了这些应该可以很好写了。

这种题不知道算不算一种类型,用26棵线段树来解决排序问题,这里是二十六棵线段树,以后可能是建有限个线段树,对他们进行重新排序,

升序或者降序,然后输出结果,都可以借助这种思想。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <iostream>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn = 1e5 + ;
struct node
{
int sum, lazy, len;
}tree[][maxn*];
char s[maxn*]; void push_up(int id)
{
for(int i=;i<;i++)
{
tree[i][id].sum = tree[i][id << ].sum + tree[i][id << | ].sum;
}
} void build(int id,int l,int r)
{
for(int i=;i<;i++)
{
tree[i][id].lazy = -;
tree[i][id].len = r - l + ;
}
if(l==r)
{
int x = s[l] - 'a';
tree[x][id].sum = ;
return;
}
int mid = (l + r) >> ;
build(id << , l, mid);
build(id << | , mid + , r);
push_up(id);
} void push_down(int id)
{
for(int i=;i<;i++)
{
if(tree[i][id].lazy!=-)
{
int val = tree[i][id].lazy;
tree[i][id << ].sum = tree[i][id << ].len*val;
tree[i][id << | ].sum = tree[i][id << | ].len*val;
tree[i][id << ].lazy = tree[i][id << | ].lazy = val;
tree[i][id].lazy = -;
}
}
}
int a[];
void query(int id,int l,int r,int x,int y)
{
if(x<=l&&y>=r)
{
for(int i=;i<;i++)
{
a[i] += tree[i][id].sum;
}
return;
}
push_down(id);
int mid = (l + r) >> ;
if (x <= mid) query(id << , l, mid, x, y);
if (y > mid) query(id << | , mid + , r, x, y);
} void update(int id,int l,int r,int x,int y)//clear
{
if(x<=l&&y>=r)
{
for(int i=;i<;i++)
{
tree[i][id].sum = ;
tree[i][id].lazy = ;
}
return;
}
push_down(id);
int mid = (l + r) >> ;
if (x <= mid) update(id << , l, mid, x, y);
if(y > mid) update(id << | , mid + , r, x, y);
push_up(id);
} void updatenum(int id, int l, int r, int x, int y,int ad)//clear
{
if (x <= l && y >= r) {
tree[ad][id].sum = tree[ad][id].len;
tree[ad][id].lazy = ;
return;
}
push_down(id);
int mid = (l + r) >> ;
if (x <= mid) updatenum(id << , l, mid, x, y, ad);
if (y > mid) updatenum(id << | , mid + , r, x, y, ad);
push_up(id);
} int main()
{
int n, m;
scanf("%d%d", &n, &m);
scanf("%s", s + );
build(, , n);
while(m--)
{
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
memset(a, , sizeof(a));
query(, , n, l, r);
update(, , n, l, r);
if(k==)
{
for(int i=;i<;i++)
{
if (a[i] == ) continue;
updatenum(, , n, r - a[i] + , r, i);
r -= a[i];
if (r <= ) break;
}
}
else if(k==)
{
for(int i=;i<;i++)
{
if (a[i] == ) continue;
// printf("i=%d l=%d r=%d\n", i, l, l + a[i] - 1);
updatenum(, , n, l, l + a[i] - , i);
l += a[i];
if (l > n) break;
}
}
}
for(int i=;i<=n;i++)
{
memset(a, , sizeof(a));
query(, , n, i, i);
for(int j=;j<;j++)
{
if(a[j])
{
printf("%c", j + 'a');
}
}
}
printf("\n");
return ;
}
/*
10 5
hbtngdflmj
1 10 1
2 9 0
3 8 1
4 7 0
5 6 1
*/

E. A Simple Task的更多相关文章

  1. 计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task

    E. A Simple Task Problem's Link: http://codeforces.com/problemset/problem/558/E Mean: 给定一个字符串,有q次操作, ...

  2. HDU-1339 A Simple Task

    http://acm.hdu.edu.cn/showproblem.php?pid=1339 正常做法超时,要有点小技巧存在. A Simple Task Time Limit: 2000/1000 ...

  3. A Simple Task

    A Simple Task Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  4. Codeforces 558E A Simple Task (计数排序&&线段树优化)

    题目链接:http://codeforces.com/contest/558/problem/E E. A Simple Task time limit per test5 seconds memor ...

  5. 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 ...

  6. 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 ...

  7. 【题解】 CF11D A Simple Task

    [题解] CF11D A Simple Task 传送门 \(n \le 20\) 考虑状态压缩\(dp\). 考虑状态,\(dp(i,j,O)\)表示从\(i\)到\(j\)经过点集\(O\)的路径 ...

  8. Codeforces 558E A Simple Task(权值线段树)

    题目链接  A Simple Task 题意  给出一个小写字母序列和若干操作.每个操作为对给定区间进行升序排序或降序排序. 考虑权值线段树. 建立26棵权值线段树.每次操作的时候先把26棵线段树上的 ...

  9. A Simple Task CodeForces - 11D

    A Simple Task CodeForces - 11D 题意:输出一个无向图的简单环数量.简单环指无重复边的环.保证图无重边自环. ans[i][j]表示"包含i中的点,以i中第一个点 ...

  10. 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 ...

随机推荐

  1. leetcode c++做题思路和题解(1)——常规题总结

    常规题总结 0. 目录 两数之和 1. 两数之和 耗时4ms(98.82%),内存6.2m. 两数之和--寻找中值向两边扩散法 1.1 思路 思路很简单,就是先找数组中target/2的前后两个值,然 ...

  2. AJ学IOS 之微博项目实战(10)微博cell中图片的显示以及各种填充模式简介

    AJ分享,必须精品 :一效果 如果直接设置会有拉伸等等的状况,这里主要介绍图片显示的一些细节 二:代码 代码实现其实很简单,微博当中用了一个photos来存放九宫格这些图片,然后用了一个photo类来 ...

  3. Mac 下 brew 切换为国内源

    简介 Homebrew 是一款自由及开放源代码的软件包管理系统,用以简化 macOS 和 linux 系统上的软件安装过程.它拥有安装.卸载.更新.查看.搜索等很多实用的功能,通过简单的一条指令,就可 ...

  4. Spring Boot 集成 Spring Security 入门案例教程

    前言 本文作为入门级的DEMO,完全按照官网实例演示: 项目目录结构 Maven 依赖 <parent> <groupId>org.springframework.boot&l ...

  5. CSS 中你应该了解的 BFC

    我们常说的文档流其实分为定位流.浮动流和普通流三种.而普通流其实就是指BFC中的FC.FC是formatting context的首字母缩写,直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲 ...

  6. c++类初始化列表初探

    目录 1 初始化和赋值 1.1 结论 2 构造函数初始化列表 2.1 结论 3 必须使用初始化列表的情况 3.1 结论 4 成员初始化顺序 5 参考资料 1 初始化和赋值 初始化:创建一个对象并赋予一 ...

  7. [GO] linux 下安装GO

    yum install mercurial安装 mercurial包 安装git包 yum install git 安装gcc yum install gcc 然后就可以下载golang的压缩包了 对 ...

  8. [源码分析] 带你梳理 Flink SQL / Table API内部执行流程

    [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 目录 [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 0x00 摘要 0x01 Apac ...

  9. 如何在非 sudo 用户下运行 docker 命令?

    当我们在一台 Linux 系统中安装了 Docker 后, 有时候会遇到下面这样的错误, 我们在运行 docker 的命令时必须加上 sudo, 例如: sudo docker ps, 但是我们其实更 ...

  10. 文本序列化【通用】word2sequence,文本序列字典保存

    ''' 文本序列化 ''' class WordSequence(): UNK_TAG = "<UNK>" PAD_TAG = "<PAD>&qu ...