bzoj1804 [Ioi2007]Flood 洪水

Description

1964年的一场灾难性的洪水冲毁了萨格热布城。洪水袭来时许多建筑的墙被彻底冲毁。在这个题目中,给定了城市在洪水来袭前的简化模型,你的任务是确定洪水过后哪些墙没有被冲毁。 简化模型由平面上的N个点和W堵墙构成。每堵墙连接两个点,没有任何一堵墙通过其它点。模型具有如下性质: • 不存在两堵墙相交或者重合的情况,但是两堵墙可以在端点相连; • 每堵墙或者平行于坐标系的横轴,或者平行于坐标系的纵轴。 最开始,整个坐标平面都是干的。在零时刻,洪水将城市的外围淹没(城市的外围是指没有被墙围起来的区域)。一个小时之后,所有一边是水,一边是空气的墙在水的压力下都会倒塌。于是洪水又会吞没那些没有被完好的墙围住的区域。接下来又有一些墙面临一边是水一边是空气,将要被洪水冲毁的局面。又过了一个小时,这些墙也被冲毁了。这样的过程不断重复,直到洪水淹没整个城市。 下图给出了洪水侵袭过程的一个例子。        (图一)在零时刻,阴影的格子代表洪水区域,白色的格子代表干的区域(有空气的区域)。(图二) 一个小时之后的情况。(图三)两个小时之后,洪水淹没了整个城市,有4堵墙没有被冲毁而留了下来。  任务 给定N个点的坐标和连接这些点的W堵墙的描述,编程确定洪水过后,哪些墙会被留下来。

Input

输入的第一行包含一个整数N(2 ≤ N ≤ 100 000), 表示平面上的点的个数。 接下来的N行每行包含两个整数X和Y(都是0到1 000 000之间(包括0和1 000 000)的整数),表示点的坐标。所有点按照它们被给出的顺序编号为1到N。没有两个点在同一位置上。 接下来一行包含一个整数W(1 ≤ W ≤ 2N),表示墙的数目。 接下来W行每行包含两个不同的整数A和B(1≤ A ≤ N, 1 ≤ B ≤ N),表示在洪水到来前,有一堵墙连接A和B。这些墙按照它们被给出的顺序编号为1到W。

Output

输出的第一行包含一个整数K,表示洪水过后留下的墙的数目。 评分 有40分的测试样例,所有坐标小于等于500。 在上面的样例和另外15分的样例中,点的个数不超过500个。 中将给出一个评测结果的总结。

将原平面图转为对偶图,边权为1,计算每个结点与外围的距离,对于每条边若两侧点到外围距离相等则此边对应的墙不会被冲毁。

#include<cstdio>
#include<queue>
const int N=400005;
int n,m;
int x[N],y[N];
int e[N][4];
int id1[N][4],id2[N][4],now,ans;
bool iso[N*2];
int es[N*2],enx[N*2],e0[N*2],ep=2;
void addedge(int a,int b){
    if(x[a]==x[b]){
        if(y[a]<y[b])e[a][1]=b,e[b][3]=a;
        else e[a][3]=b,e[b][1]=a;
    }else{
        if(x[a]<x[b])e[a][0]=b,e[b][2]=a;
        else e[a][2]=b,e[b][0]=a;
    }
}
void chk(int w){
    for(int i=0;i<4;i++)if(e[w][i]){
        if(!id1[w][i]){
            id1[w][i]=++now;
            int cs=0,c;
            int p=e[w][i],a=i+2&3;
            do{
                id2[p][a]=now;
                c=-1;
                while(!e[p][a+3&3])a=a+3&3,++c;
                cs+=c;
                a=a+3&3;
                id1[p][a]=now;
                p=e[p][a];
                a=a+2&3;
                id2[p][a]=now;
            }while(p!=w);
            c=-1;
            while(!e[p][a+3&3])a=a+3&3,++c;
            cs+=c;
            iso[now]=cs>0;
        }
    }
}
int l[N*2],d[N*2];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d",x+i,y+i);
    scanf("%d",&m);
    for(int i=0,a,b;i<m;i++){
        scanf("%d%d",&a,&b);
        addedge(a,b);
    }
    for(int i=1;i<=n;i++)chk(i);
    for(int i=1;i<=n;i++){
        for(int j=0;j<4;j++)if(e[i][j]){
            int a=id1[i][j],b=id2[i][j];
            es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
            es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
        }
    }
    std::queue<int>q;
    for(int i=1;i<=now;i++)if(iso[i])q.push(i),d[i]=1;
    while(!q.empty()){
        int w=q.front();q.pop();
        for(int i=e0[w];i;i=enx[i]){
            int u=es[i];
            if(!d[u]){
                d[u]=1;
                l[u]=l[w]+1;
                q.push(u);
            }
        }
    }
    for(int i=1;i<=now;i++){
        for(int j=e0[i];j;j=enx[j]){
            if(l[i]==l[es[j]])++ans;
        }
    }
    printf("%d",ans/4);
    return 0;
}
时间: 2024-10-20 07:22:50

bzoj1804 [Ioi2007]Flood 洪水的相关文章

扯谈网络编程之Tcp SYN flood洪水攻击

简介 TCP协议要经过三次握手才能建立连接: (from wiki) 于是出现了对于握手过程进行的攻击.攻击者发送大量的FIN包,服务器回应(SYN+ACK)包,但是攻击者不回应ACK包,这样的话,服务器不知道(SYN+ACK)是否发送成功,默认情况下会重试5次(tcp_syn_retries).这样的话,对于服务器的内存,带宽都有很大的消耗.攻击者如果处于公网,可以伪造IP的话,对于服务器就很难根据IP来判断攻击者,给防护带来很大的困难. 攻与防 攻击者角度 从攻击者的角度来看,有两个地方可以

12.2-全栈Java笔记: TCP协议和UDP协议

 区别 在网络通讯中,TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据.而UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得. 这两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递. 由于TCP需

监控io性能、free、ps命令及netstat命令、抓包工具tcpdump,tshark

一.监控io性能iostat -x 关注%utiliotop 查看哪一个进程在进行读写 二.free命令(查看内存使用)-m -h-gbuff 缓冲(cpu处理完的数据 > 内存 (buff)> 磁盘)cache 缓存(磁盘 >内存(cache) >cpu处理数据)公式:total= used + free +buff/cacheavaliable包含free 和buffer/cache剩余部分我的swap怎么全是0 三.ps命令(查看系统进程)ps aux 把系统所有的进程以快照

DDoS攻击工具

DDoS攻击工具 综合性工具 综合性工具除了可以进行DDoS攻击外,还可用于其他的用途,例如:端口扫描.安全审计.防火墙等.实际上,大部分综合性工具开发的原始目的并不是用于DDoS,而是"网络检查或测试工具" Hping ? Hping是一个编码和解码TCP/IP协议的命令行开发工具,常用于测试网络及主机的安全,同时也可以做安全审计.防火墙测试等工具的标配工具:Hping的命令行就像常用的ping命令,不同的是,它不仅能发送ICMP请求,而且支持TCP.UDP.RAW-IP等协议:Hp

洪水填充(Flood fill)算法

从一个起始节点开始把附近与其连通的节点提取出或填充成不同颜色颜色,直到封闭区域内的所有节点都被处理过为止,是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法. 因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名.在GNU Go和扫雷中,Flood Fill算法被用来计算需要被清除的区域. 洪水填充算法接受三个参数:起始节点,目标节点特征和针对提取对象要执行的处理. 目前有许多实现方式,基本上都显式的或隐式的使用了队列或者栈. 洪水填充算法实现最常见有四邻域

洪水(flood)

洪水(flood) 题目背景 Awson是某国际学校信竞组的一只菜鸡.今年,该市发生了千年难遇的洪水.被监禁在学校的Awson不甘怠堕,想将自己投入到公益服务事业中去.这天,他偷了H老师的小电驴,偷偷地溜出校. 题目描述 他观察了一下整个城市的概况,发现学校校门所在地的坐标为(X,Y).城市共有不超过100条街道,知道每条街道的起止点坐标,街道是笔直双向的,每个方向一个车道.并且确保街道是相互连通的.他每第一次走过一侧车道,满目疮夷,生灵涂炭,百感交集:或触景生情,感慨大自然的残酷,悠悠长叹:或

[LeetCode] Flood Fill 洪水填充

An image is represented by a 2-D array of integers, each integer representing the pixel value of the image (from 0 to 65535). Given a coordinate (sr, sc) representing the starting pixel (row and column) of the flood fill, and a pixel value newColor,

Linux编程之ICMP洪水攻击

我的上一篇文章<Linux编程之PING的实现>里使用ICMP协议实现了PING的程序,ICMP除了实现这么一个PING程序,还有哪些不为人知或者好玩的用途?这里我将介绍ICMP另一个很有名的黑科技:ICMP洪水攻击. ICMP洪水攻击属于大名鼎鼎的DOS(Denial of Service)攻击的一种,一种是黑客们喜欢的攻击手段,这里本着加深自己对ICMP的理解的目的,也试着基于ICMP写一段ICMP的洪水攻击小程序. 洪水攻击(FLOOD ATTACK)指的是利用计算机网络技术向目的主机发

TCP--SYN洪水攻击

在查看TCP标识位SYN时,顺便关注了一下SYN Flood,从网上查阅一些资料加以整理,SYN洪水攻击利用TCP三次握手. 1.SYN洪水介绍 当一个系统(客户端C)尝试和一个提供了服务的系统(服务器S)建立TCP连接,客户端C和服务端S会交换一系列报文. 正常的3次握手连接:首先是C发送一个SYN报文给服务端S,然后这个服务端发送一个SYN-ACK包以回应C,接着,C就返回一个ACK包来实现一次完整的TCP连接.就这样,C到服务端的连接就建立了,这时C和服务端就可以互相交换数据了. SYN洪