传送门

几波树形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]);
}
}

Codechef August Challenge 2018 : Lonely Cycles的更多相关文章

  1. Codechef August Challenge 2018 : Chef at the River

    传送门 (要是没有tjm(Sakits)的帮忙,我还真不知道啥时候能做出来 结论是第一次带走尽可能少的动物,使未带走的动物不冲突,带走的这个数量就是最优解. 首先这个数量肯定是下界,更少的话连第一次都 ...

  2. Codechef August Challenge 2018 : Safe Partition

    传送门 (虽然是A了但是不知道复杂度是不是正确的 考虑以某个位置为结尾的合法划分 先考虑min,带来的影响是限制了最小长度,预处理出这个最小长度后,这可以在处理到这个数时,把不能算的部分去掉(不满足m ...

  3. Codechef August Challenge 2018 : Interactive Matrix

    传送门 首先整个矩阵可以被分为很多小矩阵,小矩阵内所有行的单调性是一样的,所有列的单调性是一样的. 考虑如何在这样一个小矩阵中找出答案.我的策略是每次取四个角中最大值和最小值的点,这样可以每次删掉一行 ...

  4. Codechef August Challenge 2018 : Coordinate Compression

    传送门 外边二分,里面拿线段树维护贪心就行了. #include<cstdio> #include<vector> #include<cstring> #inclu ...

  5. Codechef August Challenge 2018 : Modular GCD

    传送门 一开始还手动拓欧找规律,发现好像玩不了. 然后想了想,A-B这个数比较小,枚举它的因子判断合不合法就行了. 需要特判A=B的情况. #include<cstdio> #includ ...

  6. Codechef October Challenge 2018 游记

    Codechef October Challenge 2018 游记 CHSERVE - Chef and Serves 题目大意: 乒乓球比赛中,双方每累计得两分就会交换一次发球权. 不过,大厨和小 ...

  7. Codechef September Challenge 2018 游记

    Codechef September Challenge 2018 游记 Magician versus Chef 题目大意: 有一排\(n(n\le10^5)\)个格子,一开始硬币在第\(x\)个格 ...

  8. codechef February Challenge 2018 简要题解

    比赛链接:https://www.codechef.com/FEB18,题面和提交记录是公开的,这里就不再贴了 Chef And His Characters 模拟题 Chef And The Pat ...

  9. Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal

    原文链接http://www.cnblogs.com/zhouzhendong/p/9010945.html 题目传送门 - Codechef STMINCUT 题意 在一个有边权的无向图中,我们定义 ...

随机推荐

  1. 金融量化分析【day113】:布林带策略

    一.布林带策略简介 1.简介 2.计算公式 3.图形      二.布林带策略代码 import jqdata def initialize(context): set_benchmark('0000 ...

  2. css中的数学表达式calc()

    前言 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路. 概念 数学表达式calc()是calculate计算的缩写,它允许使用+.-.*. ...

  3. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

  4. 「WC2018」通道

    没有代码能力... LOJ #2339 Luogu P4220 UOJ #347 题意 给定三棵树$ T1,T2,T3$,求一个点对$ (x,y)$使得$ T1.dist(x,y)+T2.dist(x ...

  5. C# - LINQ 表达式树

    表达式树(Expression Tree) 表达式树是不可执行的代码,它只是用于表示一种树状的数据结构,树上的每一个节点都表示为某种表达式类型,大概有25种表达式类型,它们都派生自Expression ...

  6. LaTeX技巧892: Ubuntu 安装新版本TeXLive并更新

    原文地址:http://www.latexstudio.net/archives/9788.html 摘要: 本文比较系统地介绍了在Ubuntu下的TeXLive的安装与配置测试过程,建议使用Ubun ...

  7. tnsping 不通

    好久没装oracle 了,竟然被一个简单问题一下子蒙住了,防火墙没关,或者说没有放开oracle端口,这都能忘,还是记录一下吧.

  8. mysql备份与还原 数据库的常用命令。

    一.备份数据: Mysqldump常用命令: mysqldump -u用户名 -p密码 --databases 数据库1 数据库2 > xxx.sql 常见选项: -u: 用户名 -p: 密码 ...

  9. 【原创】大叔问题定位分享(17)spark查orc格式数据偶尔报错NullPointerException

    spark查orc格式的数据有时会报这个错 Caused by: java.lang.NullPointerException at org.apache.hadoop.hive.ql.io.orc. ...

  10. SpringBoot配置

    多模块Maven项目 .gitignore文件 .idea *.iml targetout log tmp test 父模块pom文件 <?xml version="1.0" ...