CF1609E William The Oblivious (2400) (线段树+DP)

https://codeforces.com/contest/1609/problem/E

给你长为1e5的只含a,b,c的字符串,有1e5个修改(pos, c),每次将pos位置的字母改成c,每次修改后输出:将该字符串改为subsequence中不含abc的最小修改次数。

  • 在线区间修改查询容易想到线段树,考虑线段树维护怎样的信息,父子之间怎样转移?
  • t[rt].s 表示编号rt的区间,使其变为不含子序列s的最小操作数
    以ab为例,要使右区间留有b,左区间不能含a,且右区间没有ab,要使左区间留有a,右区间不能含b,且左区间没有ab
    t[k].a=t[k<<1].a+t[k<<1|1].a;
    t[k].b=t[k<<1].b+t[k<<1|1].b;
    t[k].c=t[k<<1].c+t[k<<1|1].c;
    t[k].ab=min(t[k<<1].ab+t[k<<1|1].b,t[k<<1].a+t[k<<1|1].ab);
    t[k].bc=min(t[k<<1].bc+t[k<<1|1].c,t[k<<1].b+t[k<<1|1].bc);
    t[k].abc=min({t[k<<1].abc+t[k<<1|1].c,t[k<<1].ab+t[k<<1|1].bc,t[k<<1].a+t[k<<1|1].abc});
posted @ 2022-03-19 15:30  qingyanng  阅读(63)  评论(0编辑  收藏  举报