zoukankan      html  css  js  c++  java
  • 一本通1763:简单树

    链接

    挺套路的题了,因为强制在线所以要建主席树,可以练习一下区间动态开点与标记永久化。

    #include<bits/stdc++.h>
    #define IL inline
    #define LL long long
    using namespace std;
    const int N=6e4+3;
    struct hh{
    	int to,nxt,w;
    }e[N<<1];
    int n,m,num,fir[N],dfn[N],siz[N],son[N],dep[N],top[N],fa[N],rev[N],E[N];
    LL dis[N],p1[N],p2[N],ans,K;
    IL int in(){
    	char c;int f=1;
    	while((c=getchar())<'0'||c>'9')
    	  if(c=='-') f=-1;
    	int x=c-'0';
    	while((c=getchar())>='0'&&c<='9')
    	  x=x*10+c-'0';
    	return x*f;
    }
    IL void add(int x,int y,int z){e[++num]=(hh){y,fir[x],z},fir[x]=num;}
    void dfs1(int u,int f){
    	fa[u]=f,siz[u]=1,dep[u]=dep[f]+1;
    	for(int i=fir[u],v;v=e[i].to;i=e[i].nxt)
    	  if(v^f){
    	  	dis[v]=dis[u]+(E[v]=e[i].w),dfs1(v,u),siz[u]+=siz[v];
    	  	if(siz[son[u]]<siz[v]) son[u]=v;
    		}
    }
    void dfs2(int u,int t){
    	top[u]=t,rev[dfn[u]=++num]=u;
    	if(son[u]) dfs2(son[u],t);
    	for(int i=fir[u],v;v=e[i].to;i=e[i].nxt)
    	  if(v^fa[u]&&v^son[u]) dfs2(v,v);
    }
    struct segment{
    	int c[N*400],ls[N*400],rs[N*400],rt[N],cnt;LL ans[N*400];
    	void mdy(int &o,int p,int l,int r,int ll,int rr){
    		o=++cnt,c[o]=c[p],ans[o]=ans[p],ls[o]=ls[p],rs[o]=rs[p];
    		if(l>=ll&&r<=rr){ans[o]+=p2[r]-p2[l-1],++c[o];return;}
    		ans[o]+=p2[rr]-p2[ll-1];
    		int mid=l+r>>1;
    		if(rr<=mid) mdy(ls[o],ls[p],l,mid,ll,rr);
    		else if(ll>mid) mdy(rs[o],rs[p],mid+1,r,ll,rr);
    		else mdy(ls[o],ls[p],l,mid,ll,mid),mdy(rs[o],rs[p],mid+1,r,mid+1,rr);
    	}
    	void upd(int k){
    		int x=k,Rt=rt[k-1];
    		while(top[x]){
    			mdy(rt[k],Rt,1,n,dfn[top[x]],dfn[x]);
    			x=fa[top[x]],Rt=rt[k];
    		}
    	}
    	LL query(int o,int l,int r,int ll,int rr){
    		if(!o) return 0;
    		if(l>=ll&&r<=rr) return ans[o];
    		int mid=l+r>>1;LL res=(p2[rr]-p2[ll-1])*c[o];
    		if(rr<=mid) return res+query(ls[o],l,mid,ll,rr);
    		if(ll>mid) return res+query(rs[o],mid+1,r,ll,rr);
    		return res+query(ls[o],l,mid,ll,mid)+query(rs[o],mid+1,r,mid+1,rr);
    	}
    	LL Query(int k,int x){
    		LL ans=0;
    		while(top[x]){
    			ans+=query(rt[k],1,n,dfn[top[x]],dfn[x]);
    			x=fa[top[x]];
    		}
    		return ans;
    	}
    }T;
    int main()
    {
    	int type,x,y,z,l,r;
    	n=in(),m=in(),type=in();
    	for(int i=1;i<n;++i)
    	  x=in(),y=in(),z=in(),
    	  add(x,y,z),add(y,x,z);
    	num=0,dfs1(1,0),dfs2(1,1);
    	for(int i=1;i<=n;++i) p1[i]=p1[i-1]+dis[i],p2[i]=p2[i-1]+E[rev[i]];
    	for(K=1;K<=n;++K) T.upd(K);
    	for(int i=1;i<=m;++i){
    		ans%=n,l=in(),r=in(),x=in();
    		if(type) l^=ans,r^=ans,x^=ans;
    		printf("%lld
    ",ans=dis[x]*(r-l+1)-2*(T.Query(r,x)-T.Query(l-1,x))+p1[r]-p1[l-1]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    xadmin进行全局配置(修改模块名为中文以及其他自定义的操作步骤)
    xadmin邮箱验证码 标题 EmailVerifyRecord object
    Django源码安装xadmin报错Apps aren't loaded yet.
    python虚拟环境virtualenv下安装MySQL-python(1.2.3)
    Pycharm界面的子窗口不见了,怎么办?
    MySQL-python终于安装成功了
    mysql-python 安装错误: Cannot open include file: 'config-win.h': No such file or directory
    配凑法
    双连不等式
    求参数的取值范围
  • 原文地址:https://www.cnblogs.com/yiqiAtiya/p/13923549.html
Copyright © 2011-2022 走看看