队爷们的神题选讲
yjc:CF235D
奇怪小容斥
枚举点对(x,y)表示以x为重心能分治到y的期望,树上直接用两点间距离求,中间有环就 左边不断+右边不断-两边都不断 容斥一下
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=3005; 6 int n,f,b,t1,t2,cnt,tot; 7 int deg[N],que[N],vis[N]; 8 int p[N],noww[N<<1],goal[N<<1]; 9 double ans; 10 void Link(int f,int t) 11 { 12 noww[++cnt]=p[f]; 13 goal[cnt]=t,p[f]=cnt; 14 noww[++cnt]=p[t]; 15 goal[cnt]=f,p[t]=cnt; 16 } 17 void DFS(int nde,int len,int cor) 18 { 19 vis[nde]=true; 20 if(deg[nde]==2) cor++; 21 if(cor>=2) ans+=1.0/len+1.0/(len+tot-cor*2+2)-1.0/(len+tot-cor); 22 else ans+=1.0/len; 23 for(int i=p[nde],g;i;i=noww[i]) 24 if(!vis[g=goal[i]]) DFS(g,len+1,cor); 25 } 26 int main() 27 { 28 scanf("%d",&n); 29 for(int i=1;i<=n;i++) 30 { 31 scanf("%d%d",&t1,&t2),t1++,t2++; 32 Link(t1,t2),deg[t1]++,deg[t2]++; 33 } 34 f=0,b=-1; 35 for(int i=1;i<=n;i++) 36 if(deg[i]==1) que[++b]=i; 37 while(f<=b) 38 { 39 int tn=que[f++]; 40 for(int i=p[tn],g;i;i=noww[i]) 41 if((--deg[g=goal[i]])==1) que[++b]=g; 42 } 43 for(int i=1;i<=n;i++) tot+=(deg[i]==2); 44 for(int i=1;i<=n;i++) 45 memset(vis,0,sizeof vis),DFS(i,1,0); 46 printf("%.7f",ans); 47 return 0; 48 }
(不折叠代码来假装这篇文章有很多内容的博主是屑
tbl:2018 Chinese Multi-University Training, BeihangU Contest L(CF102114)
yzh:一道题
算贡献,本质是给边定向,对未来承诺
dp[i][j][k]表示到达j个其中k个在i的子树内
发现复杂度高达$O(n^6)$,预处理一些东西
(摔
看zky的
ywy:HAOI2017字符串
说了半天就写了一道题?