咕咕咕咕咕 好像沒有模板題,所以就沒了 update by 2019/8/4 碰到了一道需要用這來優(yōu)化成O(nn)\mathcal O(n\sqrt n)O(nn?)的 luoguP3591 [POI2015]ODW
#include<cstdio>#include<cctype>#include<algorithm>#include<cmath>#include<vector>
namespace fast_IO
{constint IN_LEN=1000000,OUT_LEN=1000000;char ibuf[IN_LEN],obuf[OUT_LEN],*ih=ibuf+IN_LEN,*oh=obuf,*lastin=ibuf+IN_LEN,*lastout=obuf+OUT_LEN-1;inlinechargetchar_(){return(ih==lastin)&&(lastin=(ih=ibuf)+fread(ibuf,1,IN_LEN,stdin),ih==lastin)?EOF:*ih++;}inlinevoidputchar_(constchar x){if(oh==lastout)fwrite(obuf,1,oh-obuf,stdout),oh=obuf;*oh++=x;}inlinevoidflush(){fwrite(obuf,1,oh-obuf,stdout);}}
using namespace fast_IO;#define getchar() getchar_()#define putchar(x) putchar_((x))//#include<ctime>#define rg registertypedeflonglong ll;
template <typename T>inline T max(const T a,const T b){return a>b?a:b;}
template <typename T>inline T min(const T a,const T b){return a<b?a:b;}
template <typename T>inlinevoidmind(T&a,const T b){a=a<b?a:b;}
template <typename T>inlinevoidmaxd(T&a,const T b){a=a>b?a:b;}
template <typename T>inline T abs(const T a){return a>0?a:-a;}
template <typename T>inlinevoidSwap(T&a,T&b){T c=a;a=b;b=c;}//template <typename T> inline void swap(T*a,T*b){T c=a;a=b;b=c;}
template <typename T>inline T gcd(const T a,const T b){if(!b)return a;returngcd(b,a%b);}
template <typename T>inline T lcm(const T a,const T b){return a/gcd(a,b)*b;}
template <typename T>inline T square(const T x){return x*x;};
template <typename T>inlinevoidread(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;}
template <typename T>inlinevoidprinte(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');}
template <typename T>inlinevoidprint(const T x){if(x<0)putchar('-'),printe(-x);elseprinte(x);}constint maxn=50001,maxm=100001;
std::vector<int>kth[maxn];int head[maxn],nxt[maxm],tow[maxm],tmp;inlinevoidaddb(constint u,constint v){tmp++;nxt[tmp]=head[u];head[u]=tmp;tow[tmp]=v;}int n,part,a[maxn],b[maxn],c[maxn],d[maxn];int f[maxn][19],dep[maxn],son[maxn],nothead[maxn],F[maxn],top[maxn],las[maxn];voiddfs(constint u,constint fa){dep[u]=1;for(rg int i=head[u];i;i=nxt[i]){constint v=tow[i];if(v==fa)continue;f[v][0]=F[v]=u;d[v]=d[u]+1,dfs(v,u);if(dep[v]+1>dep[u])dep[u]=dep[v]+1,son[u]=v;}}voiddfs2(constint u,constint fa){las[top[u]]=u;for(rg int i=head[u];i;i=nxt[i]){constint v=tow[i];if(v==fa)continue;if(v==son[u])top[v]=top[u],dfs2(v,u);else top[v]=v,dfs2(v,u);}}intLCA(int u,int v){if(d[u]<d[v])Swap(u,v);int D=d[u]-d[v];for(rg int i=0;i<=16;i++)if(D&(1<<i))u=f[u][i];if(u==v)return u;for(rg int i=16;i>=0;i--)if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];return F[u];}int qz[maxn][231],id[maxn];voidDFS(constint u,constint fa){for(rg int j=1,v=F[u];j<=part;j++)qz[u][j]=qz[v][j]+a[u],v=F[v];for(rg int i=head[u];i;i=nxt[i]){constint v=tow[i];if(v==fa)continue;DFS(v,u);}}int ks[65537];intfe(int u,int dis){if(dis==0)return u;u=f[u][ks[dis]];dis-=1<<ks[dis];if(u==0)return0;return kth[top[u]][id[u]+dis];}intmain(){d[1]=1;for(rg int i=1;i<=16;i++)for(rg int j=1<<(i-1);j<(1<<i);j++)ks[j]=i-1;read(n),part=20;for(rg int i=1;i<=n;i++)read(a[i]);for(rg int i=1;i<n;i++){int u,v;read(u),read(v);addb(u,v),addb(v,u);}for(rg int i=1;i<=n;i++)read(b[i]);for(rg int i=1;i<n;i++)read(c[i]);dfs(1,0);top[1]=1,dfs2(1,0);for(rg int i=1;i<=16;i++)for(rg int j=1;j<=n;j++)f[j][i]=f[f[j][i-1]][i-1];for(rg int i=1;i<=n;i++)nothead[son[i]]=1;for(rg int i=1;i<=n;i++)if(!nothead[i]){std::vector<int>&t=kth[i];constint S=dep[i]<<1;t.resize(S+1);for(rg int j=1,u=las[i];u&&j<=S;j++){if(j<=dep[i])id[u]=j;t[j]=u,u=F[u];}}DFS(1,0);for(rg int i=1;i<n;i++){int u=b[i],v=b[i+1],step=c[i],lca=LCA(u,v);if(step<=part){int du=d[u]-d[lca],dv=d[v]-d[lca];int ans=0;int extra=du%step;du=du-extra+step;ans+=qz[u][step]-qz[fe(u,du)][step];dv+=extra;if(dv==0)print(ans);else{ans+=a[v];extra=(dv-1)%step+1;ans+=qz[fe(v,extra)][step]-qz[fe(v,dv)][step];print(ans);}}else{int ans=0;while(d[u]>=d[lca]){ans+=a[u];u=fe(u,step);}while(d[v]>d[lca]){ans+=a[v];v=fe(v,step);}print(ans);}putchar('\n');}returnflush(),0;}