admin管理员组文章数量:1794759
果树
题目大意
问一棵树上有多少条路径不包含同色点。
一种颜色最多20个点。
瞎做
对于同色点提取出来两两形成一个约束。
这样约束只有n*20个。
因为最坏情况是每种颜色都出现20次。
那么n/20*20^2=n*20。
接下来变成了owaski的那道A,可以在本博客内搜索。
#include<cstdio>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=100000+10,maxtot=maxn*160;
int h2[maxn],g2[maxn],n2[maxn],a[maxn];
int h[maxn],go[maxn*2],next[maxn*2],dfn[maxn],size[maxn],dep[maxn],zjy[maxn];
int f[maxn][25];
int h3[maxn],L[maxtot],R[maxtot],fx[maxtot],n3[maxtot];
int tree[maxn*4],bz[maxn*4];
int i,j,k,l,t,n,m,tot,top;
ll ans;
int read(){int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
void add(int x,int y){go[++tot]=y;next[tot]=h[x];h[x]=tot;
}
void add2(int x,int y){g2[++tot]=y;n2[tot]=h2[x];h2[x]=tot;
}
void add3(int x,int l,int r,int y){L[++tot]=l;R[tot]=r;fx[tot]=y;n3[tot]=h3[x];h3[x]=tot;
}
void dfs(int x,int y){f[x][0]=y;dep[x]=dep[y]+1;dfn[x]=++top;size[x]=1;int t=h[x];while (t){if (go[t]!=y){dfs(go[t],x);size[x]+=size[go[t]];}t=next[t];}
}
int find(int x,int y){int j=zjy[dep[x]];while (j>=0){if (y>=(1<<j)){y-=(1<<j);x=f[x][j];}j--;}return x;
}
void cr(int l1,int r1,int l2,int r2){if (l1>r1||l2>r2) return;add3(l1,l2,r2,1);add3(r1+1,l2,r2,-1);add3(l2,l1,r1,1);add3(r2+1,l1,r1,-1);
}
void ins(int x,int y){if (dfn[x]>dfn[y]) swap(x,y);if (dfn[x]+size[x]>=dfn[y]+size[y]){int z=find(y,dep[y]-dep[x]-1);cr(dfn[y],dfn[y]+size[y]-1,1,dfn[z]-1);cr(dfn[y],dfn[y]+size[y]-1,dfn[z]+size[z],n);}else cr(dfn[x],dfn[x]+size[x]-1,dfn[y],dfn[y]+size[y]-1);
}
void change(int p,int l,int r,int a,int b,int v){if (l==a&&r==b){bz[p]+=v;if (bz[p]) tree[p]=r-l+1;else tree[p]=(l==r?0:tree[p*2]+tree[p*2+1]);return;}int mid=(l+r)/2;if (b<=mid) change(p*2,l,mid,a,b,v);else if (a>mid) change(p*2+1,mid+1,r,a,b,v);else change(p*2,l,mid,a,mid,v),change(p*2+1,mid+1,r,mid+1,b,v);if (bz[p]) tree[p]=r-l+1;else tree[p]=(l==r?0:tree[p*2]+tree[p*2+1]);
}
int main(){freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);n=read();fo(i,1,n){j=read();add2(j,i);}tot=0;fo(i,1,n-1){j=read();k=read();add(j,k);add(k,j);}dfs(1,0);fo(i,1,n) zjy[i]=floor(log(i)/log(2));fo(j,1,zjy[n])fo(i,1,n)f[i][j]=f[f[i][j-1]][j-1];tot=0;fo(i,1,n){k=0;t=h2[i];while (t){a[++k]=g2[t];t=n2[t];}fo(j,1,k)fo(l,j+1,k)ins(a[j],a[l]);}fo(i,1,n){t=h3[i];while (t){if (fx[t]==-1) change(1,1,n,L[t],R[t],-1);t=n3[t];}t=h3[i];while (t){if (fx[t]==1) change(1,1,n,L[t],R[t],1);t=n3[t];}ans+=(ll)(n-tree[1]);}ans=(ans-(ll)n)/2+(ll)n;printf("%lld\n",ans);
}
本文标签: 果树
版权声明:本文标题:果树 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1700005916a388128.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论