zoukankan      html  css  js  c++  java
  • SP10707 COT2

    SP10707 COT2 - Count on a tree II

    树分块树上莫队。

    树上路径数颜色,在线树分块+bitset,离线可以树分块莫队。

    于是我们现在来考虑具体怎么做。

    首先树分块,分好了之后打上 (dfn)

    为什么要打 (dfn) 序呢?因为我们莫队排序的第二维不是要求是 单调递增/单调递减 的吗,如果随便移动岂不是变成 (n^2) 了,而 (dfn) 序。

    注意:在存入询问的时候,让 (u)(dfn) 序始终小于 (v)

    然后就是正常的普通莫队了。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    template <typename T>
    inline void read(T &x){
    	x=0;char ch=getchar();bool f=false;
    	while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
    	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    	x=f?-x:x;
    	return ;
    }
    template <typename T>
    inline void write(T x){
    	if(x<0) putchar('-'),x=-x;
    	if(x>9) write(x/10);
    	putchar(x%10^48);
    	return ;
    }
    #define ll long long
    const int N=1e5+5,INF=1e9+7;
    struct Query{
        int u,v,id;
        Query(int u=0,int v=0,int id=0):u(u),v(v),id(id){}
    }Q[N];
    int val[N],w[N],fa[N],dep[N],son[N],sta[N];
    int siz[N],top[N],bl[N],a[N],sum[N],b[N],dfn[N],DFN;
    bool vis[N];
    int n,m,q,Top,idx,cnt1,Cnt,block;
    int res,Ans[N];
    vector<int> vec[N];
    void dfs1(int u,int f){
    	int now=Top;
    	sta[++Top]=u,fa[u]=f,dep[u]=dep[f]+1,siz[u]=1,dfn[u]=++DFN;//压入栈和更新信息 
    	for(auto v:vec[u]){
    		if(v==f) continue;
    		dfs1(v,u);
    		if(Top-now>block){//如果里面的点多于 B 个 
    			idx++;//块编号 
    			while(Top!=now) bl[sta[Top--]]=idx;//更新节点所属块 
    		}
    		siz[u]+=siz[v];
    		if(siz[v]>siz[son[u]]) son[u]=v; 
    	}
    	return ;
    }
    void dfs2(int u,int f){//树剖预处理 
    	top[u]=f;
    	if(!son[u]) return ;
    	dfs2(son[u],f);
    	for(auto v:vec[u]){
    		if(v==fa[u]||v==son[u]) continue;
    		dfs2(v,v);
    	}
    	return ;
    }
    inline int QueryLca(int u,int v){//查询lca 
    	while(top[u]!=top[v]){
    		if(dep[top[u]]<dep[top[v]]) swap(u,v);
    		u=fa[top[u]];
    	}
    	if(dep[u]<dep[v]) return u;
    	return v;
    }
    inline bool cmp(Query a,Query b){//莫队排序 
    	return bl[a.u]!=bl[b.u]?bl[a.u]<bl[b.u]:bl[a.u]&1?dfn[a.v]<dfn[b.v]:dfn[a.v]>dfn[b.v];
    }
    inline void Update(int u){//把u这个点取反的影响(用变不用,不用变用) 
    	if(vis[u]){
    		if(sum[a[u]]==1) res--;
    		sum[a[u]]--;
    		vis[u]=false;
    	}
    	else{
    		sum[a[u]]++;
    		if(sum[a[u]]==1) res++;
    		vis[u]=true;
    	}
    	return ;
    }
    inline void Move(int u,int v){//把u->v这条路径的更新了 
    	if(dep[u]<dep[v]) swap(u,v);
    	while(dep[u]>dep[v]) Update(u),u=fa[u];
    	while(u!=v) Update(u),Update(v),u=fa[u],v=fa[v];
    	return ;
    }
    int main(){
    	read(n),read(m);
    	block=sqrt(n);
    	int Ncnt=0;
    	for(int i=1;i<=n;i++){
    		read(a[i]);//a是最初的颜色 
    		b[i]=a[i];
    	}
    	sort(b+1,b+n+1);
    	int id=unique(b+1,b+n+1)-b-1;
    	for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+id+1,a[i])-b;
    	for(int i=1;i<n;i++){//建图 
    		int u,v;read(u),read(v);
    		vec[u].push_back(v),vec[v].push_back(u);
    	}
    	for(int i=1;i<=m;i++){
    		int op,u,v;
    		read(u),read(v);
    		if(dfn[u]>dfn[v]) swap(u,v);
    		++Cnt,Q[Cnt]=Query(u,v,Cnt);//l,r,id
    	}
    	dfs1(1,0),dfs2(1,1);//分块和LCA预处理 
    	while(Top>0) bl[sta[Top--]]=idx;//分完块 
    	sort(Q+1,Q+Cnt+1,cmp);//莫队排序 
    	int u,v,t;
    	u=v=1,t=0;
    	Update(1);//初始化第一个点 
    	for(int i=1;i<=Cnt;i++){//处理询问 
    		Update(QueryLca(u,v));//两个LCA在这里要单独讨论 
    		if(u!=Q[i].u) Move(u,Q[i].u),u=Q[i].u;//u更新到u` 
    		if(v!=Q[i].v) Move(v,Q[i].v),v=Q[i].v;//v更新到v` 
    		Update(QueryLca(u,v));//讨论 
    		Ans[Q[i].id]=res;
    		
    	}
    	for(int i=1;i<=Cnt;i++) write(Ans[i]),putchar('
    '); 
    	return 0; 
    }
    
  • 相关阅读:
    自定义View的ToolBar布局报错Error:(2) No resource identifier found for attribute 'context' in package 'c
    在学git之主分支 branch
    获取发布版SHA1
    关于开启线程与UI的操作
    播放音频和视频(VideoView控件)
    通知栏Notification的应用
    Android 真机调式 Installation failed with message 远程主机强迫关闭了一个现有的连接。. It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing. WA
    运行程序申请危险权限
    mysql乐观锁总结和实践
    Nginx配置文件nginx.conf中文详解
  • 原文地址:https://www.cnblogs.com/Akmaey/p/14695975.html
Copyright © 2011-2022 走看看