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});