题目描述很明确,现在的目标是均摊两个操作的复杂度;
现在我们已知有两种方法:
1.每次用O(1)的时间修改K值,用O(N)的时间直接模拟回答询问;
2.每次修改了K值后用O(N)的时间更新所有答案,O(1)时间回答;
均摊这两种操作,可以这样做:
由于只可以从前往后跳,所以可以把跳跃路径压缩,更新时把压缩的部分更新就可以了,实现用块状链表实现,复杂度为O(N3/2);
其实块状链表只不过是水过的,正解是用splay维护一个括号序列:利用括号序列, 每次操作都是把一棵子树砍下并且接在某个结点上, 那么我们可以维护括号序列整段移动来完成这个操作. 同时为了回答询问我们需要知道每个左括号的左边有几个未匹配的左括号, Splay 可以维护这个值, 时间复杂度 O(NlogN);
由于splay巨大的常数因子,所以很不乐观。。。
块状链表几十行,漂亮多了!