Codeforces 217E Alien DNA (树状数组求第k大)

来源:互联网 发布:中国电信4g网络覆盖 编辑:程序博客网 时间:2024/05/01 03:19
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <queue>#include <map>#include <set>#include <algorithm>#include <ctime>#include <functional>#pragma comment(linker,"/STACK:102400000,102400000")using namespace std;#define eps 1e-10#define N 4020000#define B 1000007#define M 3000020#define inf 0x3f3f3f3f#define LL long long#define pii pair<int, int>#define MP make_pair#define fi first#define se second#define md (ll + rr >> 1)#define ls (i << 1)#define rs (ls | 1)#define md (ll + rr >> 1)#define lson ll, md, ls#define rson md + 1, rr, rschar s[N];int k;int n;int L[N], R[N], q;int c[N];int now;int f[N];char ans[N];void del(int x) {while(x <= k) {c[x] --;x += x & -x;}}int getp(int x) {int ret = 0;for(int i = 1 << 21; i > 0; i >>= 1) {if(ret + i <= k && c[ret + i] < x) {x -= c[ret + i];ret += i;}}return ret + 1;}int main() {scanf("%s", s + 1);n = strlen(s + 1);scanf("%d", &k);scanf("%d", &q);for(int i = 1; i <= q; ++i) {scanf("%d%d", &L[i], &R[i]);}for(int i = 1; i <= k; ++i) {c[i] = i & -i;}now = k;for(int i = q; i >= 1; --i) {for(int x = L[i] + 1, j = L[i]; j <= R[i] && R[i] < now; ++j, x += 2, now--) {if(x > R[i]) x = L[i];int p = getp(R[i] + 1);del(p);f[p] = getp(x);}}int t = 0;for(int i = 1; i <= k; ++i) {if(f[i] == 0) ans[i] = s[++t];else ans[i] = ans[f[i]];}ans[k + 1] = '\0';puts(ans + 1);return 0;}

0 0
原创粉丝点击