codeforces 558E A Simple Task 线段树
来源:互联网 发布:邯郸学院网络教学平台 编辑:程序博客网 时间:2024/05/16 00:30
题目链接
题意较为简单。
思路:
因为只有26个字母,所以用26棵线段树维护就好了,比较容易。
#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].lazystruct 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;}
0 0
- codeforces 558E A Simple Task 线段树
- Codeforces 558E. A Simple Task (线段树+计数排序)
- [线段树] codeforces 558E. A Simple Task
- codeforces 558E E. A Simple Task( 线段树+统计排序)
- [计数排序 线段树] Codeforces 558E #312 (Div. 2) E. A Simple Task
- Codeforces 558E A Simple Task (计数排序+线段树优化)
- Codeforces 558E A Simple Task(线段树区间更新)
- Codeforces 558E A Simple Task 线段树(区间更新)
- 计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task
- CF 558E(A Simple Task-计数排序+线段树)
- CF 558E A Simple Task(多维线段树)
- CF 558E A Simple Task (线段树)
- codeforces 558 E A Simple Task
- 【30.93%】【codeforces 558E】A Simple Task
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记
- Codeforces Round #312 (Div. 2) E A Simple Task 线段树
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树(未敲)
- cf #312 E. A Simple Task (线段树+计数排序)
- 我希望早几年知道的 5 个 Unix 命令
- Uva11825 - Hackers' Crackdown
- ESP8266学习笔记5:ESP8266接入yeelink
- web服务器并发访问如何提升
- 黑马程序员_面向对象笔记
- codeforces 558E A Simple Task 线段树
- c++ uniform_int_distribution 类
- thinkphp获取数组大小
- java io流常用类的使用
- zynq虐我千百遍——第4篇 Linaro之rootfs
- 杭电1145 so you want to be a 2n-aire?
- universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法
- java基本控制语句的小例子
- itunes connect开发者账号的区别,企业账号,个人账号,公司团队账号,教育账号