果树
来源:互联网 发布:淘宝店铺分析 编辑:程序博客网 时间:2024/04/28 03:05
题目大意
问一棵树上有多少条路径不包含同色点。
一种颜色最多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);}
阅读全文
0 0
- 果树
- 果园里的果树
- 小明家的果树
- 前人种的果树啊!
- HTML5 SVG 果树素描动画
- 我的理想 买座山,载果树,养鸡
- 面试题:最佳果树装箱打包问题。
- 澄清烟台苹果果袋用药与果树种植
- 关于春季果树果园的一些管理种植事项
- 结合物理引擎的cocos2dx游戏(保卫果树)
- 计蒜客47——圈果树(二维凸包)
- UVa-143-Orchard Trees(果树林)[计算几何]
- 被果树点名做一个Blog游戏,答案如下...接下来换我点名了~~!!!
- 被果树点名做一个Blog游戏,答案如下...接下来换我点名了~~!!!
- C语言如何不用goto、多处return进行错误处理?
- easyui-combobox
- 关闭Android jack 编译
- amultiple-column index
- 009
- 果树
- POJ1990 MooFest
- C++程序员是如何评价GO的
- 异步命名管道
- 6581 Number Triangle数字三角形
- Android测试之Monkey
- Javascript 严格模式详解
- linux 学习基础篇(一)
- 将个人网站主页设置为Tomcat默认打开页面