BZOJ 1123: [POI2008]BLO

1123: [POI2008]BLO

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1030  Solved: 440
[Submit][Status][Discuss]

Description

Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通。

Input

输入n<=100000 m<=500000及m条边

Output

输出n个数,代表如果把第i个点去掉,将有多少对点不能互通。

Sample Input

5 5

1 2

2 3

1 3

3 4

4 5

Sample Output

8

8

16

14

8

HINT

Source

[Submit][Status][Discuss]

分析

如果一个点不是割点,那么删去后不会对其他点之间的连通性造成影响;如果是一个割点,影响只和其连接的几个块的大小有关。因此Tarjan求割点的同时注意维护子树大小即可。

代码

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <iostream>
 6 #include <algorithm>
 7
 8 using namespace std;
 9
10 #define N 5000000
11 #define LL long long
12
13 int n, m; LL ans[N];
14
15 int hd[N], to[N], nt[N], tot;
16
17 int dfn[N], low[N], tim;
18
19 int tarjan(int u, int f)
20 {
21     dfn[u] = low[u] = ++tim; ans[u] = (n - 1) << 1;
22
23     int cnt = 0, siz; LL sum = 0, tmp = 0;
24
25     for (int i = hd[u]; ~i; i = nt[i])if (f != to[i])
26     {
27         if (!dfn[to[i]])
28         {
29             siz = tarjan(to[i], u);
30             low[u] = min(low[u], low[to[i]]);
31             if (low[to[i]] >= dfn[u])
32                 ans[u] += 2LL * siz * sum, sum += siz;
33             else
34                 tmp += siz;
35         }
36         else
37             low[u] = min(low[u], dfn[to[i]]);
38     }
39
40     ans[u] += 2LL * (n - (sum + 1)) * sum;
41
42     return sum + tmp + 1;
43 }
44
45 signed main(void)
46 {
47     scanf("%d%d", &n, &m);
48
49     memset(hd, -1, sizeof(hd)), tot = 0;
50
51     for (int i = 1; i <= m; ++i)
52     {
53         int x, y; scanf("%d%d", &x, &y);
54
55         nt[tot] = hd[x]; to[tot] = y; hd[x] = tot++;
56         nt[tot] = hd[y]; to[tot] = x; hd[y] = tot++;
57     }
58
59     memset(dfn, 0, sizeof(dfn)); tim = 0; tarjan(1, -1);
60
61     for (int i = 1; i <= n; ++i)
62         printf("%lld\n", ans[i]);
63 }

BZOJ_1123.cpp

@Author: YouSiki

时间: 2025-01-02 17:17:25

BZOJ 1123: [POI2008]BLO的相关文章

1123: [POI2008]BLO

1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MB链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1123 Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n<=100000 m<=500000及m条边 Output 输出n个数

BZOJ1123: [POI2008]BLO

1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 614  Solved: 235[Submit][Status] Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n<=100000 m<=500000及m条边 Output 输出n个数,代表如果把第i个点去掉,将有多

[POI2008]BLO

1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1519  Solved: 697[Submit][Status][Discuss] Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n<=100000 m<=500000及m条边 Output 输出n个数,代表如果把

BZOJ 1124[POI2008]枪战

题面: 1124: [POI2008]枪战Maf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 659  Solved: 259[Submit][Status][Discuss] Description 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的人也不同. Input 输入n人数<1000000 每个人的aim Output

BZOJ 1113: [Poi2008]海报PLA

题目 1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MB Description N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们. Input 第一行给出数字N,代表有N个矩形.N在[1,250000] 下面N行,每行给出矩形的长与宽.其值在[1,1000000000]2 1/2 Postering Output 最少数量的海报数. Sample Input 5 1 2 1 3 2 2 2 5 1 4 Sa

[BZOJ 1112] [POI2008] 砖块Klo 【区间K大】

题目链接:BZOJ - 1112 题目分析 枚举每一个长度为k的连续区间,求出这个区间的最优答案,更新全局答案. 可以发现,这个区间的所有柱子最终都变成这k个数的中位数时最优,那么我们就需要查询这个区间的中位数了. 找到中位数之后,我们还应该求出这个区间内小于中位数的数的和,大于中位数的数的和,从而求出操作步数. 这些需要求的值可以用线段树或平衡树来写,我写的是线段树,但是实际上这是一道POI的题目,在MAIN上的空间限制只有35MB,线段树应该是不行的. 因为平衡树只需要 O(n) 空间,所以

BZOJ 1124: [POI2008]枪战Maf

1124: [POI2008]枪战Maf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 617  Solved: 236[Submit][Status][Discuss] Description 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的人也不同. Input 输入n人数<1000000 每个人的aim Output 你要求最

BZOJ 1131: [POI2008]Sta

1131: [POI2008]Sta Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1370  Solved: 486[Submit][Status][Discuss] Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output 输出你所找到的点,如果具有多个解,请输出编号最小的那个. Sample Input

BZOJ 1112: [POI2008]砖块Klo

1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1736  Solved: 606[Submit][Status][Discuss] Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任务. Input 第一行给出N,K. (1 ≤ k ≤ n ≤