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的更多相关文章
- 计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task
E. A Simple Task Problem's Link: http://codeforces.com/problemset/problem/558/E Mean: 给定一个字符串,有q次操作, ...
- HDU-1339 A Simple Task
http://acm.hdu.edu.cn/showproblem.php?pid=1339 正常做法超时,要有点小技巧存在. A Simple Task Time Limit: 2000/1000 ...
- A Simple Task
A Simple Task Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- Codeforces 558E A Simple Task (计数排序&&线段树优化)
题目链接:http://codeforces.com/contest/558/problem/E E. A Simple Task time limit per test5 seconds memor ...
- 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 ...
- 【题解】 CF11D A Simple Task
[题解] CF11D A Simple Task 传送门 \(n \le 20\) 考虑状态压缩\(dp\). 考虑状态,\(dp(i,j,O)\)表示从\(i\)到\(j\)经过点集\(O\)的路径 ...
- Codeforces 558E A Simple Task(权值线段树)
题目链接 A Simple Task 题意 给出一个小写字母序列和若干操作.每个操作为对给定区间进行升序排序或降序排序. 考虑权值线段树. 建立26棵权值线段树.每次操作的时候先把26棵线段树上的 ...
- A Simple Task CodeForces - 11D
A Simple Task CodeForces - 11D 题意:输出一个无向图的简单环数量.简单环指无重复边的环.保证图无重边自环. ans[i][j]表示"包含i中的点,以i中第一个点 ...
- 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 ...
随机推荐
- Thymeleaf+SpringBoot+Mybatis实现的家庭财务管理系统
项目简介 项目来源于:https://gitee.com/darlingzhangsh/graduation_project 本系统是基于Thymeleaf+SpringBoot+Mybatis.是非 ...
- PostgreSQL中RECURSIVE递归查询使用总结
RECURSIVE 前言 CTE or WITH 在WITH中使用数据修改语句 WITH使用注意事项 RECURSIVE 递归查询的过程 拆解下执行的过程 1.执行非递归部分 2.执行递归部分,如果是 ...
- 数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出
此题如果直接使用有序的TreeMap就不需要这样折腾: 1.map的key值唯一性,故就不在需要set集合来去重 2.使用map后利用key的唯一性,把序列号相同的数据直接加在一起,代码会很简洁 pa ...
- 【python实现卷积神经网络】池化层实现
代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...
- SVG案例:动态去创建元素createElementNS
案例一: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- three.js obj转js的详细步骤 convert_obj_three.py的用法
three.js是最近非常流行的一个前端webgl库. js格式的模型文件是three.js中可以直接加载的文件.使用THREE.JSONLoader()直接加载,而不需要引用其它的loader插件. ...
- ASE team work proposal
Hi,我们是Azure Wrapper,欢迎来到我们的blog~我们将在这里记录下ASE课程的滴滴点点,美妙的旅程就要开始啦! 以下是每位队员提交的关于ASE 团队项目的提议: 朱玉影: 随着信息时代 ...
- 快速搭建网站信息库(小型Zoomeye)
前言:本来是不想重复造车轮的,网上资料有开源的fofa,和一些设计.有的架设太复杂了,好用东西不会用,整个毛线.还有的没有完整代码. 设计方案: 测试平台:windows 测试环境:php ...
- Chrome插件安利!可以一键导出微信读书笔记|支持Markdown等三种格式
众所周知,微信读书App 是一款非常优秀的阅读类App ,周围也有不少人在用.虽然工作比较忙.但是也没少在上面看书做笔记. 美中不足的是,目前微信读书虽然支持笔记导出,但是提供的是将笔记复制到剪切板, ...
- 进阶 Linux基本命令-1
vmware三种网络模式1,桥接虚拟机直接连接外网,局域网.宿主机电脑不提供路由. 2,NAT网络地址转换,家庭网 3,host only 只能和宿主电脑打交道 Linux命令形式 命令 +[参数]+ ...