bzoj 1015 并查集
逆向思维,先将整张图以最后所有要求的点毁掉的状态建图,然后倒着
加点就行了,用并查集维护连通块
/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/
//By BLADEVIL
var
n, m, k :longint;
flag :array[..] of boolean;
pre, other, last :array[..] of longint;
delete, x, y, ans :array[..] of longint;
father :array[..] of longint;
l :longint;
procedure connect(x,y:longint);
begin
inc(l);
pre[l]:=last[x];
last[x]:=l;
other[l]:=y;
end;
procedure init;
var
i :longint;
begin
read(n,m);
for i:= to m do
begin
read(x[i],y[i]);
connect(x[i],y[i]);
connect(y[i],x[i]);
end;
read(k);
for i:= to k do
begin
read(delete[i]);
flag[delete[i]]:=true;
end;
end;
function getfather(x:longint):longint;
begin
if father[x]=x then exit(x);
father[x]:=getfather(father[x]);
exit(father[x]);
end;
procedure main;
var
i :longint;
fa, fb :longint;
cur :longint;
q, p :longint;
begin
for i:= to n- do father[i]:=i;
for i:= to m do
begin
if (not flag[x[i]]) and (not flag[y[i]]) then
begin
fa:=getfather(x[i]); fb:=getfather(y[i]);
if fa<>fb then father[fa]:=fb;
end;
end;
for i:= to n do if (not flag[i]) and (father[i]=i) then inc(ans[k+]);
for i:=k downto do
begin
cur:=delete[i];
ans[i]:=ans[i+];
q:=last[cur];
inc(ans[i]);
while q<> do
begin
p:=other[q];
if not flag[p] then
begin
fa:=getfather(p);
if fa<>cur then
begin
dec(ans[i]);
father[fa]:=cur;
end;
end;
q:=pre[q];
end;
flag[cur]:=false;
end;
for i:= to k+ do writeln(ans[i]);
end;
begin
init;
main;
end.
bzoj 1015 并查集的更多相关文章
- BZOJ 1015 并查集+离线倒序
统计块个数写错了调了好久啊,BZOJ1696的弱化版本. #include <iostream> #include <cstring> #include <algorit ...
- BZOJ 1015 并查集&连通块
很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道互相直接或 ...
- bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列
详见vfleaking在discuss里的题解. 收获: 当我们要顺序枚举一个序列,并且跳过某些元素,那么我们可以用并查集将要跳过的元素合并到一起,这样当一长串元素需要跳过时,可以O(1)跳过. 暴力 ...
- bzoj 2303 并查集
首先如果没有限制的话,我们可以直接求出答案,假设对于n*m的矩阵,我们最上方一行和左方的一列随意确定,那么首先这写确定的状态肯定是不会不合法的,因为我们可以调整剩下的01状态来使得这一行一列的状态合法 ...
- bzoj 1854 并查集 + 贪心
思路:这个题的并查集用的好NB啊, 我们把伤害看成图上的点,武器作为边,对于一个联通块来说, 如果是一棵大小为k的树,那么这个联通块里面有k - 1个伤害能被取到,如果图上有环那么k个值都能 取到,对 ...
- bzoj 1202 并查集
首先我们知道若干区间和信息,判断给出信息是否合法,可以用并查集维护,我们用dis[x]表示x到father[x]的距离为多少,即区间father[x]到x的长度,这样我们可以在路径压缩的时候维护dis ...
- BZOJ 3910 并查集+线段树合并
思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...
- BZOJ 1116 并查集
思路: 如果 每个联通块 边数>=点数 就OK 用并查集搞 //By SiriusRen #include <cstdio> #include <cstring> #in ...
- bzoj 1050 并查集
先按边长排序,假设s与t连通,那么我们可以枚举s与t的路径中最短的一条边,通过类似与kruskal的方法找到s与t的路径在当前最小边权情况下尽量小的最大边权,用这个比值更新答案. 特别的,我们对于某一 ...
随机推荐
- C# Datetime类常用技巧
C#类常用技巧 //今天DateTime.Now.Date.ToShortDateString();//昨天,也就是今天的日期减一DateTime.Now.AddDays(-1).ToShortDat ...
- php 递归 适合刚刚接解递归的人看
递归,就是自己调用自己,当满足某条件时层层退出(后进先出). --------------------------------------------------------------------- ...
- 用js读、写、删除Cookie
//已经验证过 // JavaScript Document //使用说明: //设置缓存:setCookie("name",value); //获取缓存:var name=ge ...
- 【MySql】5.6.14版本的安装和测试
当前状态:apache2.4.6和php5.5.6已经安装成功: mysql的安装和测试: 一.安装mysql5.6.14,参考http://wenku.baidu.com/link?url=_0jk ...
- Android工程目录及其作用简介
1. src:存放所有的*.java源程序. 2. gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3. assets:可以存放项目一些较大的资源文件,例如: ...
- 【推介】GitHub
隆重推介:GitHub(https://github.com/) 作为开源代码库以及版本控制系统,Github拥有140多万开发者用户. 随着越来越多的应用程序转移到了云上,Github已经成为了管理 ...
- 使用Telerik控件搭建Doubanfm频道部分
今天感觉好累啊..还是坚持记录下. 收集的API: https://github.com/HakurouKen/douban.fm-api https://github.com/zonyitoo/do ...
- C语言--通用类型栈
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h&g ...
- 应聘复习基础笔记1:网络编程之TCP与UDP的优缺点,TCP三次握手、四次挥手、传输窗口控制、存在问题
重要性:必考 一.TCP与UDP的优缺点 ①TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供 ...
- 初识java之Mina(一)
Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务.虚拟机管道通信服务等) ...