• Tree and Queries CodeForces


    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn = 1e6;
    int col[maxn];
    int num[maxn];
    int vis[maxn];
    int idx,h[maxn],e[maxn],ne[maxn];
    int tl[maxn],tr[maxn];
    struct query{
        int l,r,id,k;
    }a[maxn];
    void add(int a,int b){
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    void dfs(int u,int fa){
    	//子树对应的dfs序的左区间 
        tl[u]=++idx;
        num[idx]=col[u];
        for(int i=h[u];~i;i=ne[i]){
            if(e[i]!=fa)
    			dfs(e[i],u);
        }
        //子树对应的dfs序的右区间 
        tr[u]=idx;
    }
    int sz;
    bool cmp(query a,query b){
        if(a.l/sz!=b.l/sz)
    		return a.l<b.l;
        return a.r<b.r;
    }
    int lowbit(int x){
        return x&-x;
    }
    int tree[maxn];
    int query(int pos){
        int ans=0;
        for(int i=pos;i;i-=lowbit(i))
        	ans+=tree[i];
        return ans;
    }
    void update(int pos,int val){
        if(pos<=0)
    		return;
    	for(int i=pos;i<maxn;i+=lowbit(i))
    		tree[i]+=val;
    }
    int ans[maxn];
    int main()
    {
        memset(h,-1,sizeof h);
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&col[i]);
        for(int i=1;i<n;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            add(x,y);
            add(y,x);
        }
        idx=0;
        dfs(1,-1);
        sz=sqrt(idx);
        for(int i=1;i<=m;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            a[i].l=tl[x];
            a[i].r=tr[x];
            a[i].k=y;
            a[i].id=i;
        }
        sort(a+1,a+1+m,cmp);
        int L=1,R=0;
        for(int i=1;i<=m;i++){
            while(L<a[i].l){
                update(vis[num[L]],-1);
                vis[num[L]]--;
                update(vis[num[L]],1);
                L++;
            }
            while(R<a[i].r){
                R++;
                update(vis[num[R]],-1);
                vis[num[R]]++;
                update(vis[num[R]],1);
            }
            while(L>a[i].l){
                L--;
                update(vis[num[L]],-1);
                vis[num[L]]++;
                update(vis[num[L]],1);
            }
            while(R>a[i].r){
                update(vis[num[R]],-1);
                vis[num[R]]--;
                update(vis[num[R]],1);
                R--;
            }
            ans[a[i].id]=query(maxn-1)-query(a[i].k-1);
        }
        for(int i=1;i<=m;i++)
            printf("%d
    ",ans[i]);
        return 0;
    }
    
  • 相关阅读:
    SPOJ-BRCKTS (括号序列,线段树)
    bzoj 2223 [Coci 2009]PATULJCI
    bzoj 1049 [HAOI2006]数字序列
    bzoj2091 [Poi2010]The Minima Game
    bzoj 1016 [JSOI2008]最小生成树计数
    bzoj5105 晨跑 数论lcm
    bzoj 1211 [HNOI2004]树的计数
    bzoj 1430 小猴打架 prufer 性质
    Swing界面组件的通用属性
    数字调节控件JSpinner的使用
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12380934.html
Copyright © 2020-2023  润新知