zoukankan      html  css  js  c++  java
  • 【JZOJ6227】【20190621】ichi

    题目

    img

    $n , m ,d,xle 10^5 , $强制在线

    题解

    • 对原树做dfs,得到原树的dfs序

    • 对kruksal重构树做dfs,得到重构树的dfs序

    • 那么就是一个三维数点问题

    • 强制在线并且卡空间,我写的线段树套(splay)

    • (主要想存一下模板OVO)

      #include<bits/stdc++.h>
      #define ll long long 
      #define il inline 
      #define rg register 
      
      using namespace std;
      
      const int N=100010,M=20;
      int n,m,ty,a[N],X1,Y1,X2,Y2,V;
      struct Edge{int u,v,w;}e[N];
      il bool cmp(Edge x,Edge y){return x.w>y.w;}
      ll ans,tmp;
      
      il char gc(){
      	static char*p1,*p2,s[1000000];
      	if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
      	return(p1==p2)?EOF:*p1++;
      }
      il int rd(){
      	int x=0;char c=gc();
      	while(c<'0'||c>'9')c=gc();
      	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
      	return x;
      }
      
      struct Kruskal{
      	int cnt,ls[N*2],rs[N*2],idx,st[N*2],ed[N*2],fa[N*2][M],bin[20],w[N*2],f[N*2],dep[N*2];
      	il void cal1(int u){X2=st[u];}
      	il void cal2(int u,int x){
      		for(int i=17;~i;--i)if(w[fa[u][i]]>=x)u=fa[u][i];
      		X2=st[u];Y2=ed[u];
      	}
      	void dfs(int u){
      		st[u]=++idx;
      		for(int i=1;bin[i]<=dep[u];++i)fa[u][i]=fa[fa[u][i-1]][i-1];
      		if(ls[u]){
      			dep[ls[u]]=dep[rs[u]]=dep[u]+1;
      			fa[ls[u]][0]=fa[rs[u]][0]=u;
      			dfs(ls[u]);dfs(rs[u]);
      		}
      		ed[u]=idx;
      	}
      	int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
      	il void init(){
      		for(int i=bin[0]=1;i<20;++i)bin[i]=bin[i-1]<<1;
      		for(int i=1;i<=n;++i)f[i]=i;
      		sort(e+1,e+n,cmp);cnt=n;
      		for(int i=1;i<n;++i){
      			int u=find(e[i].u),v=find(e[i].v);
      			w[++cnt]=e[i].w;
      			ls[cnt]=u,rs[cnt]=v;
      			f[u]=f[v]=f[cnt]=cnt;
      		}
      		dfs(cnt);
      	}
      }T2;
      
      struct Tree{
      	int o=1,hd[N],st[N],ed[N],idx;
      	struct edge{int v,nt;}E[N<<1];
      	il void adde(int u,int v){
      		E[o]=(edge){v,hd[u]};hd[u]=o++;
      		E[o]=(edge){u,hd[v]};hd[v]=o++;
      	}
      	il void cal1(int u){X1=st[u];}
      	il void cal2(int u){X1=st[u];Y1=ed[u];}
      	void dfs(int u,int F){
      		st[u]=++idx;
      		for(int i=hd[u];i;i=E[i].nt){
      			int v=E[i].v;
      			if(v==F)continue;
      			dfs(v,u);
      		}
      		ed[u]=idx;
      	}
      	il void init(){dfs(1,0);}
      }T1;
      
      struct Splay{
      	int sz,rt[N<<2],fa[N*M*2],ch[N*M*2][2],le[N*M*2],ri[N*M*2],Le[N*M*2],Ri[N*M*2];
      	ll ly[N*M*2],sum[N*M*2];
      	il void init(int k){rt[k]=++sz;le[sz]=Le[sz]=0;ri[sz]=Ri[sz]=2*n;}
      	il void pushup(int k){
      		int l=ch[k][0],r=ch[k][1];
      		Le[k]=l?Le[l]:le[k];
      		Ri[k]=r?Ri[r]:ri[k];
      	}
      	il void mfy(int k,int x){sum[k]+=x;ly[k]+=x;}
      	il void pushdown(int k){
      		if(!ly[k])return;
      		mfy(ch[k][0],ly[k]);
      		mfy(ch[k][1],ly[k]);
      		ly[k]=0;
      	}
      	void push(int x){
      		if(fa[x])push(fa[x]);
      		pushdown(x);
      	}
      	il void rotate(int x,int&k){
      		int y=fa[x],z=fa[y];
      		if(y!=k)ch[z][ch[z][1]==y]=x;else k=x;
      		int l=ch[y][1]==x,r=l^1;
      		fa[x]=z;fa[y]=x;fa[ch[x][r]]=y;
      		ch[y][l]=ch[x][r];ch[x][r]=y;
      		pushup(y);pushup(x);
      	}
      	il void splay(int x,int&k){
      		push(x);
      		for(int y,z;x!=k;rotate(x,k)){
      			y=fa[x],z=fa[y];
      			if(y!=k)rotate((ch[z][1]==y)^(ch[y][1]==x)?x:y,k);
      		}
      	}
      	il int find(int k,int x){
      		if(le[k]<=x&&x<=ri[k])return k;
      		if(Le[ch[k][0]]<=x&&x<=Ri[ch[k][0]])return find(ch[k][0],x);
      		return find(ch[k][1],x);
      	}
      	il void update(int k){
      		int l=X2-1,r=Y2+1;
      		int x=find(rt[k],l);splay(x,rt[k]);
      		if(l<ri[x]){
      			sum[++sz]=sum[x];
      			ri[sz]=ri[x];ri[x]=l;le[sz]=l+1;
      			fa[ch[sz][1]=ch[x][1]]=sz;
      			fa[ch[x][1]=sz]=x;
      			pushup(sz);pushup(x);
      		}
      		int y=find(ch[x][1],r);splay(y,ch[x][1]);
      		if(le[y]<r){
      			sum[++sz]=sum[y];
      			le[sz]=le[y];le[y]=r;ri[sz]=r-1;
      			fa[ch[sz][0]=ch[y][0]]=sz;
      			fa[ch[y][0]=sz]=y;
      			pushup(sz);pushup(y);
      		}
      		mfy(ch[y][0],V);
      	}
      	il void query(int k){
      		int x=find(rt[k],X2);
      		splay(x,rt[k]);
      		tmp+=sum[x];
      	}
      }D2;
      
      struct segment{
      	#define ls (k<<1)
      	#define rs (k<<1|1)
      	il void build(int k,int l,int r){
      		D2.init(k);
      		if(l==r)return;
      		int mid=(l+r)>>1;
      		build(ls,l,mid);
      		build(rs,mid+1,r);
      	}
      	il void update(int k,int l,int r,int x,int y){
      		if(l==x&&r==y){D2.update(k);return;}
      		int mid=(l+r)>>1;
      		if(y<=mid)update(ls,l,mid,x,y);
      		else if(x>mid)update(rs,mid+1,r,x,y);
      		else update(ls,l,mid,x,mid),update(rs,mid+1,r,mid+1,y);
      	}
      	il void query(int k,int l,int r){
      		D2.query(k);
      		if(l==r)return;
      		int mid=(l+r)>>1;
      		if(X1<=mid)query(ls,l,mid);
      		else query(rs,mid+1,r);
      	}
      }D1;
      
      int main(){
      	freopen("ichi.in","r",stdin);
      	freopen("ichi.out","w",stdout);
      	n=rd();m=rd();ty=rd();
      	for(rg int i=1;i<=n;++i)a[i]=rd();
      	for(rg int i=1,u,v,w;i<n;++i){
      		u=rd();v=rd();w=rd();
      		e[i]=(Edge){u,v,w};
      		T1.adde(u,v);
      	}
      	T1.init();
      	T2.init();
      	D1.build(1,1,n);
      	for(rg int i=1,op,u,x,y;i<=m;++i){
      		op=rd();
      		if(op==1){
      			u=rd();if(ty)u=(u+ans)%n+1;
      			T1.cal1(u);T2.cal1(u);
      			tmp=0;D1.query(1,1,n);
      			ans=a[u]+tmp;
      			printf("%lld
      ",ans);
      		}else{
      			y=rd();x=rd();
      			u=rd();if(ty)u=(u+ans)%n+1;
      			T1.cal2(u);T2.cal2(u,x);
      			V=y;D1.update(1,1,n,X1,Y1);
      		}
      	}
      	return 0;
      }
      
      
  • 相关阅读:
    Django集成celery发送异步邮件
    Bootstrap表格实现列左右调整大小
    Django通用类视图实现忘记密码重置密码功能
    Django项目使用ckeditor(不使用admin)
    HTML提交form表单后获取返回的数据
    Django后端发送小程序微信模板消息(服务通知)
    Django对接支付宝实现支付宝充值金币功能
    Django全文搜索django-haystack+whoosh+jieba实现中文全文搜索
    Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
    PHP socket 接收 java端口 netty 网络字节序
  • 原文地址:https://www.cnblogs.com/Paul-Guderian/p/11074016.html
Copyright © 2011-2022 走看看