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 ...
随机推荐
- java消除 list重复值及交集,并集,差集
消除 list重复值 Java代码 public void removeDuplicate(List list) { HashSet h = new HashSet(list); list.clea ...
- 2019-05-12 Python之模拟体育竞赛
一.简介 可以选择任意规则,模拟不同的两个队伍进行球赛的模拟比赛 二.源代码 函数介绍: from random import * #输出介绍信息 def printIntro(): print(&q ...
- stand up meeting 11/17/2015
今日工作总结: 冯晓云:代表组内参加了北航软工M1检查,有幸在工作展开之前先观摩别人的工作,吸取经验和教训:现在看来,当时对往届ASE学员的采访还不够深入,只说统筹分工团结合作还是有些空,具体的任务划 ...
- 前端架构演进及主流UI
@ 目录 前端三要素 JavaScript 框架 NodeJs 常用UI框架 前后端分离的演进 MVVM模式 总结 前端演进到现在,各种技术框架已经层出不穷了,作为一名开发少不了要干一些前端的活儿,那 ...
- 曹工说Redis源码(7)-- redis server 的周期执行任务,到底要做些啥
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...
- notepad++批量每行加字符
移动光标到头 选择正则 输入^ 下面输入需要加的文本. 点替换
- linux CVE-2019-14287 Sudo提权漏洞
CVE-2019-14287 sudo介绍 sudo,也就是以超级管理员身份运行(superuser do)的意思.sudo 是 Linux 中最常使用的重要实用程序之一,它功能十分强大,几乎安装在每 ...
- Springboot:logback日志管理(九)
Springboot默认使用的日志框架就是logback 创建自定义的logback-spring.xml放在resources类目录下即可 logback-spring.xml: <?xml ...
- Python 实用冷门知识整理
1.print 打印带有颜色的信息 大家知道 Python 中的信息打印函数 print,一般我们会使用它打印一些东西,作为一个简单调试. 但是你知道么,这个 Print 打印出来的字体颜色是可以设置 ...
- php内置函数call_user_func()
<?php //call_user_func(callback,name,age) //第一个参数callback作为回掉函数使用,其余的参数是他的参数 function now($a,$b) ...