题目大意:
就是现在给出一个有N个结点的树(N <= 100000)编号从1到N, 树的根节点为1, 给定K, 每个点都有一个权值, 权值0 <= wi <= 10^9, 现在有Q次询问, 对于每次询问给出一个x代表询问在编号x的结点及其子树中, 出现恰好K次的取值有多少种?
大致思路:
第一次写莫队算法.....
对于静态的满足能在O(1)的时间把[L, R]的答案转移到[L, R + 1], [L - 1, R]的问题, 可以考虑莫队算法, 这题先将N个结点的后序遍历顺序处理出来, 那么每次询问就相当于在这个数列中询问连续的一段中恰好出现K次的数的种数, 于是先将权值离散化然后就可以计数了
将Q次询问离线出来分块, 按照右端点递增排序, 根据莫队算法, 复杂度在O(Nsqrt(N))级别
代码如下:
Result : Accepted Memory : 10928 KB Time : 1279 ms
/*
* Author: Gatevin
* Created Time: 2015/8/2 18:52:13
* File Name: Sakura_Chiyo.cpp
*/
#pragma comment(linker, "/STACK:16777216")
#include
#include
#include
#include
#include
#include
#include
#include
#include