CF 375D Tree and Queries(dfs序+分块查找)

题意:给出一棵树,每个结点都有一个颜色的值,有m个查询,每个查询v,k,表示询问结点v的子树中,某一个颜色数量大于k的颜色的数量。

思路:首先,通过dfs,可以把查询一棵树的子树转化为查询一段区间[l,r]。接下来,把整个区间分成n/sqrt(n)+1份,将查询按照l所在的区间排序,在同一区间内,将查询按r排序(由大到小)。对于查询,用一个数组表示某颜色数为x的颜色的个数,查询这个数组用分块法查询。。。

代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=100000+3000;
const int SIZE=300;
int bnt[maxn],block[maxn/SIZE+10],cnt[maxn];
int l[maxn],r[maxn],dfs_clock;
int c[maxn],cval[maxn],ans[maxn],n,m;
vectorg[maxn];
struct Query
{
    int l,r,k,id;
    Query(){}
    Query(int lx,int rx,int kk,int i){l=lx;r=rx;k=kk;id=i;}
    bool operator <(const Query &q) const
    {
        if(l/SIZE!=q.l/SIZE) return lq.r;
    }
}querys[maxn];
void dfs(int u,int fa)
{
    l[u]=++dfs_clock;
    cval[l[u]]=c[u];
    int sz=g[u].size();
    for(int i=0;ir) Add(++r);
        while(querys[i].l>l) Dec(l++);
        while(querys[i].r

你可能感兴趣的:(数据结构)