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. 多级菜单初写(dict使用)

    #!/usr/bin/env python3# -*- coding:utf-8 -*-# name:zzyumap = { "中国":{ "北京":{ &qu ...

  2. AJ学IOS 之小知识iOS启动动画_Launch Screen的运用

    AJ 分享,必须精品 看下效果吧 例如新浪微博的软件开启时候 就是这个 用Launch image实现 这个不难,就是在Images.xcassets 增加一个LaunchImage文件(右键 new ...

  3. Linux下安装python3环境搭建

    Linux下python3环境搭建 Linux安装软件有哪些方式? rpm软件包 手动安装 拒绝此方式 需要手动解决依赖关系 yum自动化安装 自动处理依赖关系 非常好用 源代码编译安装,可自定义的功 ...

  4. icepdf和pdfbox转pdf文档为图片

    icepdf转pdf文档为图片 首先导入icepdf jar包或maven pdfPath为pdf文件路径.pdfimgpsth为图片保存的路径 public static void icePdfIm ...

  5. atom跨平台超好用的markdown实时预览

    https://atom.io/ sublime有预览markdown的插件,但仅限于每次在浏览器中预览,想要找一个能够实时在软件中预览的,终于发现了atom. 很多功能以插件的形式安装,theme也 ...

  6. MySQL服务端恶意读取客户端文件漏洞 (DDCTF2019和国赛均涉及到这个漏洞)

    mysql协议中流程和go语言实现的恶意mysql服务器:https://blog.csdn.net/ls1120704214/article/details/88174003 poc :https: ...

  7. spring-boot-lll-starter自动化框架介绍

    1. spring-boot-lll-starter自动化框架介绍 1.1. 前言 舔着脸来介绍一波我刚写的自动化框架,spring-boot-lll-starter框架是经由我企业实战总结的一套,适 ...

  8. Component Object Model (COM) 是什么?

    本文主要介绍 COM 的基础知识,倾向于理论性的理解,面向初学者,浅尝辄止. 1. COM 是什么: COM 的英文全称是,Component Object Model,中文译为,组件对象模型.它官方 ...

  9. 【集群实战】NFS网络文件共享服务

    1. NFS介绍 1.1 什么是NFS? NFS是Network File System的缩写,中文意思是网络文件系统. 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录. ...

  10. 【Linux常见命令】touch命令

    touch - change file timestamps touch [文件名] 就是“摸”一下文件,如果文件不存在,就建立新文件:如果文件存在,就改变文件的访问时间atime等时间戳信息. 语法 ...