传送门

几波树形dp就行了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define MN 5100000
using namespace std; struct na{int x,y,ne;}b[MN<<];
int n,m,t,x,y,st[MN],c[MN],s[MN],S[MN],num,l[MN],pdf[MN],nm;
long long ans[MN];
bool bo[MN],W[MN<<];
inline void add(int x,int y){b[++num].x=x;b[num].y=y;b[num].ne=l[x];l[x]=num;W[num]=;}
void pre(int x,int f){
bo[x]=;pdf[++nm]=x;//printf("%d %d\n",nm,x);
for (int i=l[x];i;i=b[i].ne)
if (b[i].y!=f)
if (bo[b[i].y]) pre(b[i].y,x);
}
void dfs(int x,int p,int f){
bo[x]=;
for (int i=l[x];i;i=b[i].ne)
if (!W[i]&&b[i].y!=f)
if (!bo[b[i].y]) st[p]=i,dfs(b[i].y,p+,x);else{
W[i]=W[i^]=;
for (int j=p-;j>=;j--){
W[st[j]]=W[st[j]^]=;
if (b[st[j]].x==b[i].y) break;
}
}
}
void DFS(int x,int f){
bo[x]=;s[x]=;
//printf("%d %d\n",x,s[x]);
for (int i=l[x];i;i=b[i].ne)
if (b[i].y!=f&&!W[i]) DFS(b[i].y,x),s[x]+=s[b[i].y];
}
void _DFS(int x,int f,int w){
bo[x]=;
for (int i=l[x];i;i=b[i].ne)
if (b[i].y!=f&&!W[i]) _DFS(b[i].y,x,w+s[x]-s[b[i].y]);
S[x]=s[x]+w;
}
void work(int x,int f){
bo[x]=;
for (int i=l[x];i;i=b[i].ne)
if (b[i].y!=f)
if (!W[i]) work(b[i].y,x),c[x]+=c[b[i].y];else{
if (bo[b[i].y]) work(b[i].y,x);
c[x]+=S[b[i].y];
}
}
void _work(int x,int f,int w1,int w2){
bo[x]=;
for (int i=l[x];i;i=b[i].ne)
if (b[i].y!=f)
if (W[i]){
if (!bo[b[i].y]) _work(b[i].y,x,,S[x]);
ans[i>>]=1LL*S[x]*S[b[i].y];
}else{
_work(b[i].y,x,w1+s[x]-s[b[i].y],w2+c[x]-c[b[i].y]);
ans[i>>]=1LL*(S[x]-s[b[i].y])*s[b[i].y]+1LL*s[b[i].y]*(w2+c[x]-c[b[i].y])+1LL*(S[x]-s[b[i].y])*c[b[i].y];
}
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(st,,(n+)*);
memset(c,,(n+)*);
memset(s,,(n+)*);
memset(S,,(n+)*);
memset(pdf,,(n+)*);
num=;nm=;
for (int i=;i<=n;i++) l[i]=,bo[i]=;
for (int i=;i<=m;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x),ans[i]=; for (int i=;i<=n;i++)
if (bo[i])
pre(i,); for (int i=;i<=n;i++)
if (!bo[pdf[i]])
dfs(pdf[i],,); for (int i=;i<=n;i++)
if (bo[pdf[i]]) DFS(pdf[i],);
for (int i=;i<=n;i++)
if (!bo[pdf[i]]) _DFS(pdf[i],,); for (int i=;i<=n;i++)
if (bo[pdf[i]]) work(pdf[i],);
for (int i=;i<=n;i++)
if (!bo[pdf[i]]) _work(pdf[i],,,); for (int i=;i<=m;i++) printf("%lld\n",ans[i]);
//printf("%d %d %d %d\n",S[1],S[2],S[3],S[4]);
//printf("%d %d %d %d %d %d\n",W[2],W[3],W[4],W[5],W[6],W[7]);
}
}

最新文章

  1. c#中两种不同的存储过程调用与比较
  2. 线程与并发系列一:Lock、Monitor、UserSpinLock
  3. String类中的equals()方法
  4. Android从入门到精通pdf+书源代码
  5. 如何区分Shapefile,Coverage,Geodatabase(转载)
  6. i&amp;1、负数二进制
  7. docker学习笔记7:发布镜像到docker hub上
  8. [Elasticsearch] 部分匹配 (一) - 前缀查询
  9. 【动态规划】滚动数组的求解(C++)
  10. codevs 3981 动态最大子段和
  11. oracle 分析函数和开窗函数
  12. C#自定义FTP访问类的代码
  13. 非极大值抑制(NMS)
  14. Django详细流程
  15. 201671010142 2017-2 《java第十二章学习感悟》
  16. 微信小程序自运营器 微信小程序自动运营器(让你的微信小程序,公众号零运营成本,24小时全自动运营)
  17. 针对zstack虚拟机导出的问题的解决办法!
  18. 【学亮IT手记】jQuery text()/html()回调函数实例
  19. windows servier2008+virtualenv下部署Flask (IIS+wfastcgi)
  20. 在Windows上弄一个redis的docker容器

热门文章

  1. 分布式监控系统开发【day38】:监控数据如何画图(九)
  2. dubbo核心要点及下载(dubbo二)
  3. Python 各种进制转换
  4. Aurora — 一个在 MSOffice 内输入 LaTeX 公式的很好用插件
  5. [物理学与PDEs]第4章第3节 一维反应流体力学方程组 3.3 一维反应流体力学方程组的数学结构
  6. java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or.....
  7. dubbo负载均衡与集群集群容错
  8. Pycharm工具导入requests包(python新手)
  9. python图片转为base64
  10. TCP-IP详解笔记5