题目链接
题意较为简单。
思路:
因为只有26个字母,所以用26棵线段树维护就好了,比较容易。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143#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].lazy struct 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; }
最后
以上就是暴躁火龙果最近收集整理的关于codeforces 558E A Simple Task 线段树的全部内容,更多相关codeforces内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复