codeforces 899 F

来源:互联网 发布:贝思外贸软件数据导出 编辑:程序博客网 时间:2024/06/01 19:26

题意:给你一个长度为n的字符串,只包括大小写字母与数字,还有q个操作,对于每个操作 将[l,r]区间内删除字符ch


题解:对于这个操作l,r,是之间操作完的串的l,r,也就是你还需要找到原始串中的l,r
方法是开62个线段树,每一个维护区间和,那么对于如何寻找原来的l,r,进行前缀和的二分查找,前缀和等于l的地方就是原始串中l的地方


这题把我折磨死了= =。 62个线段树刚好卡在内存附近,打的lazy标记需要改成flag,反正是区间修改1和0


#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <string>#include <map>#include <cmath>#include <queue>#include <set>#define INF 0x3f3f3f3fusing namespace std;const int maxn = 2e5 + 5;typedef long long LL;char s[maxn];int sum[maxn * 4][65];bool lazy[maxn * 4][65];int getid(char x){    if('a' <= x && x <= 'z') return (int)(x - 'a');    else if('A' <= x && x <= 'Z') return (int)(x - 'A' + 26);    return (int)(x - '0' + 52);}void bulid(int l, int r, int o){    if(l == r){        sum[o][getid(s[l])] = 1;        return;    }    int m = (l + r) / 2;    bulid(l, m, o*2);    bulid(m+1, r, o*2+1);    for(int i=0; i<62; i++){        sum[o][i] = sum[o*2][i] + sum[o*2+1][i];    }}void pushdown(int o, int pos){    if(lazy[o][pos]){        sum[o*2][pos] = 0;        sum[o*2+1][pos] = 0;        lazy[o*2][pos] = lazy[o*2+1][pos] = lazy[o][pos];        lazy[o][pos] = false;    }}void update(int l, int r, int ql, int qr, int o, int k){    if(ql <= l && qr >= r){        sum[o][k] = 0;        lazy[o][k] = true;        return;    }    int m = (l + r) / 2;    for(int i=0; i<62; i++)        pushdown(o,i);    if(m >= ql)        update(l,m,ql,qr,o*2,k);    if(m < qr)        update(m+1,r,ql,qr,o*2+1,k);    for(int i=0; i<62; i++)        sum[o][i] = sum[o*2][i] + sum[o*2+1][i];}void print(int l, int r, int o){    if(l == r){        for(int i=0; i<62; i++)            if(sum[o][i] > 0){                printf("%c",s[l]);                break;            }        return;    }    int m = (l + r) / 2;    for(int i=0; i<62; i++)        pushdown(o,i);    print(l,m,o*2);    print(m+1,r,o*2+1);}int FIND(int l, int r, int o, int k){    if(l == r){        return l;    }    for(int i=0; i<62; i++)        pushdown(o, i);    int m = (l + r) / 2;    int ans = 0;    for(int i=0; i<62; i++){        ans += sum[o*2][i];    }    if(ans >= k) return FIND(l,m,o*2,k);    else        return FIND(m+1,r,o*2+1,k - ans);}int main(){    int n,q;    scanf("%d%d",&n,&q);    scanf("%s",s+1);    bulid(1,n,1);    while(q--){        int l, r;        char ch;        scanf("%d%d %c",&l,&r,&ch);        l = FIND(1,n,1,l);        r = FIND(1,n,1,r);        update(1,n,l,r,1,getid(ch));    }    print(1,n,1);    printf("\n");    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宫崎骏龙猫高清图片 宫崎骏龙猫图片 龙猫能长多大 龙猫素描图片 龙猫图片宠物 龙猫图片宫崎骏 纯白龙猫多少钱一只 卡通龙猫图片 龙猫卡通图片高清 龙猫小梅图片 龙猫高清图片 龙猫寿命多长 龙猫一只多少钱 龙猫用品批发 宠物龙猫专卖店 龙猫大概多少钱一只 龙猫生病了怎么办 小龙猫多少钱一只 龙猫卡通蛋糕 宠物龙猫价格 龙猫宠物图片 纯种龙猫价格 白色龙猫多少钱一只 毛绒玩具龙猫 龙猫能活多少年 龙猫毛绒玩具多少钱一只 龙猫便秘症状 龙猫怎么训练 龙猫哪里有卖 买龙猫的网站 龙猫饲养方法 龙猫多少钱一直 一只龙猫大概多少钱 龙猫娃娃价格 龍貓 金丝鼠 丝绒黑龙猫 毛丝鼠 longmao 毛丝鼠多少钱一只 手绘图片卡通龙猫