Codechef August Challenge 2018 : Lonely Cycles
几波树形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的更多相关文章
- Codechef August Challenge 2018 : Chef at the River
传送门 (要是没有tjm(Sakits)的帮忙,我还真不知道啥时候能做出来 结论是第一次带走尽可能少的动物,使未带走的动物不冲突,带走的这个数量就是最优解. 首先这个数量肯定是下界,更少的话连第一次都 ...
- Codechef August Challenge 2018 : Safe Partition
传送门 (虽然是A了但是不知道复杂度是不是正确的 考虑以某个位置为结尾的合法划分 先考虑min,带来的影响是限制了最小长度,预处理出这个最小长度后,这可以在处理到这个数时,把不能算的部分去掉(不满足m ...
- Codechef August Challenge 2018 : Interactive Matrix
传送门 首先整个矩阵可以被分为很多小矩阵,小矩阵内所有行的单调性是一样的,所有列的单调性是一样的. 考虑如何在这样一个小矩阵中找出答案.我的策略是每次取四个角中最大值和最小值的点,这样可以每次删掉一行 ...
- Codechef August Challenge 2018 : Coordinate Compression
传送门 外边二分,里面拿线段树维护贪心就行了. #include<cstdio> #include<vector> #include<cstring> #inclu ...
- Codechef August Challenge 2018 : Modular GCD
传送门 一开始还手动拓欧找规律,发现好像玩不了. 然后想了想,A-B这个数比较小,枚举它的因子判断合不合法就行了. 需要特判A=B的情况. #include<cstdio> #includ ...
- Codechef October Challenge 2018 游记
Codechef October Challenge 2018 游记 CHSERVE - Chef and Serves 题目大意: 乒乓球比赛中,双方每累计得两分就会交换一次发球权. 不过,大厨和小 ...
- Codechef September Challenge 2018 游记
Codechef September Challenge 2018 游记 Magician versus Chef 题目大意: 有一排\(n(n\le10^5)\)个格子,一开始硬币在第\(x\)个格 ...
- codechef February Challenge 2018 简要题解
比赛链接:https://www.codechef.com/FEB18,题面和提交记录是公开的,这里就不再贴了 Chef And His Characters 模拟题 Chef And The Pat ...
- Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal
原文链接http://www.cnblogs.com/zhouzhendong/p/9010945.html 题目传送门 - Codechef STMINCUT 题意 在一个有边权的无向图中,我们定义 ...
随机推荐
- CMDB服务器管理系统【s5day90】:获取今日未采集主机列表
1.目录结构 1.服务器端 2.客户端 2.具体代码如下 1.数据库增加两个字段 class Server(models.Model): """ 服务器信息 " ...
- 第二节:深入剖析Thread的五大方法、数据槽、内存栅栏。
一. Thread及其五大方法 Thread是.Net最早的多线程处理方式,它出现在.Net1.0时代,虽然现在已逐渐被微软所抛弃,微软强烈推荐使用Task(后面章节介绍),但从多线程完整性的角度上来 ...
- 070、如何定制Calico 网络policy(2019-04-15 周一)
参考https://www.cnblogs.com/CloudMan6/p/7552618.html Calico默认的policy是:容器只能与同一个calico网络中的容器通信. Ca ...
- jQuery AJAX 方法 success()后台传来的4种数据
JAVA中的四种JSON解析方式详解 jQuery AJAX 方法 success()后台传来的4种数据 1.后台返回一个页面 js代码 /**(1)用$("#content-wrapper ...
- [物理学与PDEs]第1章第1节 引言
1. 电动力学研究的对象是电磁场, 研究电磁场的基本属性---运动规律及它和带电物质的相互作用. 2. 场, 物质的一种存在方式. 3. Maxwell 方程组是电动力学中的基本方程, 是一切有关电磁 ...
- UE导航系统详
配置 Navigation Crowd Manager Class 代理人管理类 可以自定义个 Navigation System Auto Create Navigation Data 导航数据在没 ...
- notepad++ 代码注释快捷键
在用notepad++进行代码编辑的过程中 单行.多行注释 //方式 :ctrl+k 取消单行.多行.区块注释 :ctrl+sh ...
- 通俗易懂的vuex-demo
在main.js引入store.js
- Ansible-----条件判断与错误处理
when 在ansible中,条件判断的关键词是when --- - hosts: all remote_user: root tasks: - debug: msg: "System re ...
- php exit die的区别
exit 输出一个消息并且退出当前脚本 void exit([string $status]) void exit(int $status)中止脚本的执行.尽管调用了exit(),Shutdow函数以 ...