传送门

几波树形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. 通信协议:HTTP、TCP、UDP

    TCP   HTTP   UDP: 都是通信协议,也就是通信时所遵守的规则,只有双方按照这个规则“说话”,对方才能理解或为之服务. TCP   HTTP   UDP三者的关系: TCP/IP是个协议组 ...

  2. python3: 简单4步骤输出九九乘法表

    如何输出一个九九乘法表,使用python语言,嵌套循环,4行代码就可以实现,瞬间感觉python真的很简单~ 代码: for i in range(1,10): for j in range(1,i+ ...

  3. 《Java编程思想第四版》第 16 章 设计范式-提到观察者模式

    在由Gamma,Helm 和 Johnson 编著的<Design Patterns>一书中被定义成一个“里程碑”.那本书列出了解决这个问题的 23 种不同的方法 16.1.2 范式分类 ...

  4. 【译】索引进阶(一):SQL SERVER索引介绍

      [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正]  原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/7 ...

  5. 非root用户安装java版本

    有时候,我们所用的用户并不是root用户,升级java版本,其实是一个非常简单的过程,具体过程如下: 将下载好的tar包进行解压,然后进行配置文件,在命令行敲入  vi ~/.bashrc,在这个文件 ...

  6. JS函数可以再添加属性(包括方法)

    1 前言 JS函数可以再添加属性(包括方法),这个有点有趣,记录一下. 2 代码 <!DOCTYPE html> <html> <head> <title&g ...

  7. linux 解决Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

    第一种: sudo vim /etc/resolv.conf 添加nameserver 8.8.8.8 第二种: /etc/apt/sources.list 的内容换成 deb http://old- ...

  8. Sleep和wait

    sleep()和wait()的区别及wait方法的一点注意事项   一.查看API sleep是Thread类的方法,导致此线程暂停执行指定时间,给其他线程执行机会,但是依然保持着监控状态,过了指定时 ...

  9. NOIP基本算法

    NOIP基本算法 1.二分 poj 2018 Best Cow Fences ▪ http://poj.org/problem?id=2018 ▪ 题意:给定一个正整数数列

  10. ubuntu 16.04系统下解决MySQL 5.7版本的root用户重置密码问题

    最近在ubuntu系统上安装了MySQL,但是安装时没有提示输入root用户密码,在网上找了一天解决方案,试图修改root用户下的登入密码,但是网上的帖子都不凑效,最后终于改成功了,因此记下来以供有同 ...