日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF-558E(E. A Simple Task)

發(fā)布時(shí)間:2024/4/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF-558E(E. A Simple Task) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

CF-558E(E. A Simple Task)


題目鏈接

題意

長度為NNN的串,給qqq次修改每次修改給出一個(gè)區(qū)間[L,R][L,R][L,R],你需要將區(qū)間的字符按照升序或降序排列.輸出qqq次修改的串.

思路

對于每個(gè)區(qū)間我們可以用計(jì)數(shù)排序,這樣效率高一點(diǎn).但如果對于每個(gè)詢問我們都O(n)O(n)O(n)遍歷這樣效率有點(diǎn)低,所以可以用線段樹維護(hù)每個(gè)字符在每個(gè)位置的狀態(tài).對于一個(gè)詢問先統(tǒng)計(jì)統(tǒng)計(jì)每個(gè)字符出現(xiàn)的數(shù)量,然后在對應(yīng)位置清空,最后將排序之后的插入線段樹中.總的復(fù)雜度為O(26?q?log(n))O(26*q*log(n))O(26?q?log(n))

#include <bits/stdc++.h> const int maxn = 1e5 + 5; const int inf = 0x3f3f3f3f; const int mod = 1e9 + 7; using namespace std; char s[maxn]; struct ac{int T[maxn<<2], lazy[maxn<<2];void pushup(int rt) {T[rt] = T[rt<<1] + T[rt<<1|1];}void pushdown(int rt, int l, int r, int mid) {if (lazy[rt] == -1) return;lazy[rt<<1] = lazy[rt<<1|1] = lazy[rt];if (lazy[rt] == 0) {T[rt<<1] = T[rt<<1|1] = 0;}else {T[rt<<1] = mid - l + 1;T[rt<<1|1] = r - mid;}lazy[rt] = -1;}void build(int rt, int l, int r) {if (l == r) {T[l] = 0;lazy[l] = -1;return;}int mid = (l + r) >> 1;build(rt<<1, l, mid);build(rt<<1|1, mid+1, r);pushup(rt);}void update(int rt, int l, int r, int ql, int qr, int d) {if (l > qr || r < ql) return;if (l >= ql && r <= qr) {if (d == 0) lazy[rt] = T[rt] = 0;else {if (lazy[rt] < 1) lazy[rt] = d;else lazy[rt] += d; T[rt] += d * (r - l + 1);}return;}int mid = (l + r) >> 1;pushdown(rt, l, r, mid);update(rt<<1, l, mid, ql, qr, d);update(rt<<1|1, mid+1, r, ql, qr, d);pushup(rt);}int query(int rt, int l, int r, int ql, int qr) {if (l > qr || r < ql) return 0;if (l >= ql && r <= qr) return T[rt];int mid = (l + r) >> 1;pushdown(rt, l, r, mid);int L = query(rt<<1, l, mid, ql, qr);int R = query(rt<<1|1, mid+1, r, ql, qr);return L + R;} }seg[26]; int cnt[30]; int main() {int n, m;scanf("%d %d", &n, &m);scanf("%s", s);for (int i = 0; i < 26; ++i) seg[i].build(1, 1, n);for (int i = 0; i < n; ++i) seg[s[i]-'a'].update(1, 1, n, i+1, i+1, 1);for (int i = 0, l,r,k; i < m; ++i) {scanf("%d %d %d", &l, &r, &k);fill(cnt, cnt+30, 0);for (int j = 0; j < 26; ++j) {cnt[j] += seg[j].query(1, 1, n, l, r);seg[j].update(1, 1, n, l, r, 0);}int pre = 0;if (k == 0) {for (int j = 25; j >= 0; --j) {if (cnt[j] == 0) continue;seg[j].update(1, 1, n, pre+l, pre+cnt[j]+l-1, 1);pre += cnt[j];}}else {for (int j = 0; j < 26; ++j) {if (cnt[j] == 0) continue;seg[j].update(1, 1, n, pre+l, pre+cnt[j]+l-1, 1);pre += cnt[j];}}}for (int i = 1; i <= n; ++i) {for (int j = 0; j < 26; ++j) {if (seg[j].query(1, 1, n, i, i)) {printf("%c", j+'a');goto here;}}here:;}puts("");return 0; }

總結(jié)

以上是生活随笔為你收集整理的CF-558E(E. A Simple Task)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。