[LUOGU] P3469 [POI2008]BLO-Blockade
https://www.luogu.org/problemnew/show/P3469
求无向图分别删去每个点后不连通的点对数。
首先,对于任何一个点,它本身删了,就会和剩下的n-1个点不连通,点对是有序的,所以初始答案为(n-1)*2
接下来考虑一些删去后能使原图分裂的点,也就是割点,它们带来的额外贡献就是 π(分裂出的几个连通块大小)*2,考虑如何求连通块数。
这里卡住了,看了sol..看来对tarjan的理解还是不够深
在原搜索树上记录子树siz[v],记sum=Σsiz[v],所以父亲那边的点就是n-sum-1个(减去自己),现在考虑这些连通块的贡献。
子树之间互相不连通,产生sum*siz[v]的贡献(sum晚一步更新,保证不重不漏),这样就可以计算子树间的贡献了。
然后计算父亲和子树们的贡献,就是siz[fa]*sum,此时sum已经更新为了整个子树的大小,siz[fa]=n-sum-1
时间复杂度O(n)
今天突然好困qwq
#include<iostream>
#include<cstdio> using namespace std; inline int rd() {
int ret=,f=;
char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} const int MAXN=; int n,m; struct Edge {
int next,to,w;
} e[MAXN*];
int ecnt,head[MAXN];
inline void add(int x,int y) {
e[++ecnt].next = head[x];
e[ecnt].to = y;
head[x] = ecnt;
} int dfn[MAXN],low[MAXN],tim;
long long siz[MAXN],ans[MAXN];
void tarjan(int x) {
dfn[x]=low[x]=++tim;
siz[x]=;
long long sum=;
for(int i=head[x]; i; i=e[i].next) {
int v=e[i].to;
if(!dfn[v]) {
tarjan(v);siz[x]+=siz[v];
low[x]=min(low[x],low[v]);
if(dfn[x]<=low[v]) {
ans[x]+=sum*siz[v];
sum+=siz[v];
}
} else{
low[x]=min(low[x],dfn[v]);
}
}
ans[x]+=sum*(n-sum-);
} int main() {
n=rd();
m=rd();
int x,y,w;
for(int i=; i<=m; i++) {
x=rd();
y=rd();
add(x,y);
add(y,x);
}
for(int i=;i<=n;i++) if(!dfn[i]) tarjan(i);
for(int i=;i<=n;i++) ans[i]+=n-;
for(int i=;i<=n;i++) printf("%lld\n",ans[i]<<);
return ;
}
[LUOGU] P3469 [POI2008]BLO-Blockade的更多相关文章
- [Luogu P3469] [POI2008]BLO-Blockade (割点)
题面 传送门:https://www.luogu.org/problemnew/show/P3469 Solution 先跟我大声念: poi! 然后开始干正事. 首先,我们先把题目中的点分为两类:去 ...
- 【luogu P3469 [POI2008]BLO-Blockade】 题解
题目链接:https://www.luogu.org/problemnew/show/P3469 #include <cstdio> #include <cstring> #i ...
- 割点判断+luogu 3469 POI2008 BLO
1.根节点,有2棵及以上子树 2.非根节点,有子节点dfn[u]<=low[v] #include <bits/stdc++.h> #define N 1000050 using n ...
- BZOJ 1123 && Luogu P3469 [POI2008]BLO-Blockade 割点+乘法原理
想了半天式子...最后在邓大师的帮助下想出此题....QWQ我还是太菜了 对于一个非割点,ans+=2*(n-1); 对于一个割点,ans+= #include<cstdio> #incl ...
- 洛谷 P3469 [POI2008]BLO-Blockade (Tarjan,割点)
P3469 [POI2008]BLO-Blockade https://www.luogu.org/problem/P3469 题目描述 There are exactly nn towns in B ...
- BZOJ 1123: [POI2008]BLO
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1030 Solved: 440[Submit][Status] ...
- BZOJ1123: [POI2008]BLO
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 614 Solved: 235[Submit][Status] ...
- BZOJ 1123: [POI2008]BLO( tarjan )
tarjan找割点..不是割点答案就是(N-1)*2, 是割点的话就在tarjan的时候顺便统计一下 ------------------------------------------------- ...
- bzoj 1123 [POI2008]BLO Tarjan求割点
[POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1540 Solved: 711[Submit][Status][Discu ...
随机推荐
- 51nod 1268【dp】
思路: 很水的dp吧...问的都是能否组成.. 哦对,这里sum最大才2e7,不会是2e9所以放心dp #include<cstdio> #include <map> #inc ...
- hdoj5115【区间DP·基础】
题意: 有n头wolf排成一排,杀一头wolf回受到受到的伤害=它的本身a[i]+相邻两个b[i-1]+b[i+1].然后杀死第k个位置的wolf的话,k-1和k+1默认相邻(满足的话). 思路: 用 ...
- HDU 5101
hdoj5101 lower_bound函数: 题意: 从两个不同集合拿出两个数,加的和大于k的可行的方案数 思路: 答案=从所有数中选择的两个加和大于k的数的方案数-在同一个集合中选择的两个加和大于 ...
- CCF2016.4 - C题
思路:先把路径按反斜杠split成数组,然后用一个ArrayList去模拟.如果遇到空或者.则不处理:如果遇到..则删除ArrayList最后一个元素(注意如果只有1个元素则不删除):其他情况直接加到 ...
- pip 安装出现提示
The directory '/home/zdj/.cache/pip/http' or its parent directory is not owned by the current user a ...
- Codeforces Round #261 (Div. 2) D
Description Parmida is a clever girl and she wants to participate in Olympiads this year. Of course ...
- 模拟+贪心 URAL 1804 The Machinegunners in a Playoff
题目传送门 题意:A队和B队踢球,已知一场比赛A和B的得分情况,问A最小再得几分就能胜利还有最多能的几分还能给B队一丝翻盘的希望.规则如下: 1. 总分数相等的情况下,在客场得分高的获胜,如果还相等, ...
- 使用PlSQLDeveloper工具查询Oracle会话数
PlSQLDeveloper工具提供了会话管理功能. 能够查询会话内容.杀死会话.查看会话SQL等操作. 常用的会话查询SQL如下: -- 查询所有会话 select * from v$session ...
- (转)深入理解Java对象的创建过程
参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一 ...
- 139 Word Break 单词拆分
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,确定 s 是否可以被空格分割为一个或多个在字典里出现的单词.你可以假设字典中无重复的单词.例如,给出s = "leet ...