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 题意 在一个有边权的无向图中,我们定义 ...
随机推荐
- windows下创建启动脚本bat
最主要是运用bat命令. call执行命令 比如 启动solr的服务,以前要进去solr的目录,然后bin/solr start 这样很麻烦.可以写个脚本放到桌面. call %CATALINA ...
- Entity Framework入门教程(15)---DbContext追踪实体状态改变
这一节介绍DbContext追踪实体的变化.EF支持DbContext在其生命周期中自动追踪加载的实体.我们可以通过DbChangeTracker类获取DbContext追踪的所有实体的变化. 注意每 ...
- NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
.NET Core 控制台程序没有 ASP.NET Core 的 IWebHostBuilder 与 Startup.cs ,那要读 appsettings.json.注依赖.配日志.设 IOptio ...
- 第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能
一. ThreadPool简介 ThreadPool简介:ThreadPool是一个线程池,当你需要开启n个线程时候,只需把这个指令抛给线程池,它将自动分配线程进行处理,它诞生于.Net 2.0时代. ...
- [数学杂志]AML
Copied from: http://www.elsevier.com/journals/applied-mathematics-letters/0893-9659/guide-for-author ...
- L1-Day1
L1-Day11.我是一个网虫.(描述关系)[我的翻译]I am a net worm.[标准答案]I am a webaholic.[对比分析]我的worm是实实在在的虫子,本句话想表达的意思是对网 ...
- python的request包
1,request包基本用法 import requests a=requests.get("http://www.baidu.com")print a.text #以文本形式打印 ...
- centos7.5环境下编译安装php7.0.30并安装redis和mongo扩展
.安装php7..30的脚本 # vim install_php.sh #!/bin/bash # 安装基本依赖 yum install -y gcc gcc-c++ htop telnet ioto ...
- P4147 玉蟾宫--单调栈
P4147 玉蟾宫 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子 ...
- RabbitMQ可靠性投递及高可用集群
可靠性投递: 首先需要明确,效率与可靠性是无法兼得的,如果要保证每一个环节都成功,势必会对消息的收发效率造成影响.如果是一些业务实时一致性要求不是特别高的场合,可以牺牲一些可靠性来换取效率. 要保证消 ...