唉,拖延症好严重啊。 其实分块的写法还是很简单的,高中不太懂,看了一堆什么最小曼哈顿生成树,感觉被吓尿,现在感觉也不是太难。 就是说如果区间查询可以离线,并且相邻的区间可以通过较快的时间复杂度进行转移,这种题目就是典型的莫队题啦。
先来一道例题 小Z的袜子
1 |
|
http://codeforces.com/contest/86/problem/D 这个东西倒是很裸的莫队,但是这个常数确实卡的很厉害。。。
1 |
|
http://codeforces.com/problemset/problem/617/E 其实用到的就是异或的很简单的性质。。。 但是我却想了半天都没想到,真是好菜啊。。。 设\(sum[i]\)为异或的前缀和,\(sum[i-1] \otimes sum[j]=k\)就是\(i\)到\(j\)的异或值为\(k\)的条件,然后拿莫队简单处理一下就好了,还是比较简单的。
1 |
|
http://codeforces.com/contest/700/problem/D 这个题我觉得还是很强的。 其实这个题目的难点完全不在莫队算法的设计上啊orz。 用莫队来维护每个值出现的次数,出现次数相同的值再丢到同一个数组下标中来维护。 比较精髓的地方是哈夫曼树的构造,这个地方竟然可以分块。 对于出现次数小于\(\sqrt N\)的值,我们可以一路枚举推过去。 对于出现次数大于\(\sqrt N\)的值,一定不会太多,我们可以正常的用优先队列来进行维护。 然后总的复杂度就是\(O(N\sqrt NlogN)\)
1 |
|