JZOJ622720190621ichi
Posted paul-guderian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZOJ622720190621ichi相关的知识,希望对你有一定的参考价值。
题目
$n , m ,d,x\\le 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 Edgeint 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 edgeint 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\\n",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;
以上是关于JZOJ622720190621ichi的主要内容,如果未能解决你的问题,请参考以下文章