【BZOJ4452】[Cerc2015]Export Estimate

Description

给你一个n个点m条边的无向图,每条边有权值,我们可以选择一个整数lim来生成一个新的图,过程如下: 
1.先将原图中边权小于lim的边删掉 
2.依次从1到n枚举每个点 
(a)如果这个点没有边于它相连,这个点将会被删去 
(b)如果这个点只与两条不相同的边x,y相连,设这两条边的另一个点分别为a,b,如果a,b和这个点都不相同(a,b可以相同),则依次做如下操作: 
(i)删去边x,y 
(ii)删去这个点 
(iii)在a,b之间建立一条新的边 
下面这个例子lim=95: 
 
数据保证原图没有重边和自环,但不保证经过如上操作后的图没有重边和自环。 
现在我们想知道当lim取若干值时,由原图生成的新图的点数和边数是多少。 

Input

第一行两个数n,m,表示原图有n点m条边。 
接下来m行,每行三个数a,b,c,表示a和b之间有一条边权为c的双向边。 
接下来一行一个数q,表示有q次询问。 
接下来一行q个数,k1,k2,...,kq。 

Output

总共q行,每行两个数,表示lim取ki时,生成的新图的点数和边数 

Sample Input

Sample Input1:
6 7
1 2 20
2 3 80
2 5 100
3 5 50
3 4 100
5 6 90
4 6 100
4
25 75 85 95
Sample Input2:
10 14
2 7 150
1 2 100
2 3 150
3 1 200
1 4 60
4 5 20
2 5 100
5 6 90
6 7 120
7 5 130
6 8 50
8 9 200
9 10 200
10 7 200
5
300 50 95 100 110

Sample Output

Sample Output1:
2 3
1 1
2 1
4 2
Sample Output2:
0 0
6 9
4 5
4 5
5 4
数据范围:
1<=n<=300000
1<=m<=300000
0<=c<=300000
1<=q<=300000
0<=ki<=300000

题解:发现在删除一个点的时候,其余点的度数不变,除了形成自环的情况,再结合几个例子就能发现:

最后的点数=n-度数为0的点的个数-度数为2的点的个数+环数
最后的边数=m-度数为2的点的个数+环数

所以用并查集来维护有几个环即可,具体地,维护一个连通块中点的个数以及度数为2的点的个数,如果相等则说明这是一个环。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=300010;
int n,m,Q;
int s0,s2,cir;
struct node
{
int a,b,c;
}p[maxn];
struct query
{
int org,k;
}q[maxn];
int f[maxn],siz[maxn],sz[maxn],d[maxn],a1[maxn],a2[maxn];
bool cmpc(const node &a,const node &b)
{
return a.c>b.c;
}
bool cmpk(const query &a,const query &b)
{
return a.k>b.k;
}
int find(int x)
{
return (f[x]==x)?x:(f[x]=find(f[x]));
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd();
int i,j,a,b;
for(i=1;i<=m;i++) p[i].a=rd(),p[i].b=rd(),p[i].c=rd();
sort(p+1,p+m+1,cmpc);
Q=rd();
for(i=1;i<=Q;i++) q[i].org=i,q[i].k=rd();
sort(q+1,q+Q+1,cmpk);
for(i=1;i<=n;i++) siz[i]=1,f[i]=i;
s0=n;
for(i=j=1;i<=m;i++)
{
for(;j<=Q&&q[j].k>p[i].c;j++)
a1[q[j].org]=n-s0-s2+cir,a2[q[j].org]=i-1-s2+cir;
s0-=(!d[p[i].a])+(!d[p[i].b]),s2-=(d[p[i].a]==2)+(d[p[i].b]==2);
a=find(p[i].a),b=find(p[i].b);
cir-=(siz[a]==sz[a])+(a!=b&&siz[b]==sz[b]);
sz[a]-=(d[p[i].a]==2),sz[b]-=(d[p[i].b]==2);
d[p[i].a]++,d[p[i].b]++;
s2+=(d[p[i].a]==2)+(d[p[i].b]==2);
sz[a]+=(d[p[i].a]==2),sz[b]+=(d[p[i].b]==2);
if(find(a)!=find(b)) siz[b]+=siz[a],sz[b]+=sz[a],f[a]=b;
cir+=(siz[b]==sz[b]);
}
for(;j<=Q;j++) a1[q[j].org]=n-s0-s2+cir,a2[q[j].org]=m-s2+cir;
for(i=1;i<=Q;i++) printf("%d %d\n",a1[i],a2[i]);
return 0;
}
 

【BZOJ4452】[Cerc2015]Export Estimate 并查集的更多相关文章

  1. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  2. 关押罪犯 and 食物链(并查集)

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...

  3. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  4. bzoj1854--并查集

    这题有一种神奇的并查集做法. 将每种属性作为一个点,每种装备作为一条边,则可以得到如下结论: 1.如果一个有n个点的连通块有n-1条边,则我们可以满足这个连通块的n-1个点. 2.如果一个有n个点的连 ...

  5. [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...

  6. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  7. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  8. Codeforces 731C Socks 并查集

    题目:http://codeforces.com/contest/731/problem/C 思路:并查集处理出哪几堆袜子是同一颜色的,对于每堆袜子求出出现最多颜色的次数,用这堆袜子的数目减去该值即为 ...

  9. “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)

    题意:初始时有个首都1,有n个操作 +V表示有一个新的城市连接到了V号城市 -V表示V号城市断开了连接,同时V的子城市也会断开连接 每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号 ...

随机推荐

  1. 历届蓝桥杯C/C++省赛试题

    2012年第三届蓝桥杯C/C++程序设计本科B组省赛 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 2014年第五届蓝桥杯C/C++程序设计本科B组省赛 2015年第六届蓝桥杯C/C++程序设 ...

  2. Css样式兼容IE6,IE7,FIREFOX的写法

    根据FF和IE对一些符号识别的差异,我们可以单独对FF以及IE定义样式,例子: 区别IE6与FF:          background:orange;*background:blue;   区别I ...

  3. 逻辑斯特回归(logistic regression)的迭代变权最小平方差算法(IRLS)

    参考资料:http://blog.csdn.net/xuanyuansen/article/details/41050507 习题: 数据及代码:  https://pan.baidu.com/s/1 ...

  4. Android isUserAMonkey()

    Monkey是Android上的一个自动化测试工具.产生随机事件由于压力测试等. ActivityManager.isUserAMonkey()判断当前是否有运行的Monkey测试.有就返回true. ...

  5. ImageNet Classification with Deep Convolutional Neural Networks 论文解读

    这个论文应该算是把深度学习应用到图片识别(ILSVRC,ImageNet large-scale Visual Recognition Challenge)上的具有重大意义的一篇文章.因为在之前,人们 ...

  6. bt开源的客户端——xbt client

    我部署好了bt tracker, 用bitcomet可以下载. 但xbt client下载不来.torrent资源.

  7. Prime is problem - 素数环问题

    题目描述: A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each ...

  8. 调用外部 DLL 中的函数(2. 晚绑定)

    , b, t, );end; procedure TForm1.FormDestroy(Sender: TObject);begin  FreeLibrary(inst);  {记得释放}end; e ...

  9. libui-node体验笔记

    简介 libui-node是基于libui库的node封装.libui库是一个简便的将本地原生的GUI封装的C语言库,并支持各平台(Mac,Linux,windows).官网提供了第三方封装文档,开发 ...

  10. 基于windows的mongodb不支持mongodbsniff等其他一些功能

    http://stackoverflow.com/questions/15934102/mongodbs-mongosniff-for-windows