【题目描述】
BZOJ1018 | SHOI2008-堵塞的交通traffic

 有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可
以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个
城市和3C-2条道路。 小人国的交通状况非常槽糕。有的时候由于交通堵塞,两座城市之间的道路会变得不连通,
直到拥堵解决,道路才会恢复畅通。初来咋到的你决心毛遂自荐到交通部某份差事,部长听说你来自一个科技高度
发达的世界,喜出望外地要求你编写一个查询应答系统,以挽救已经病入膏肓的小人国交通系统。 小人国的交通
部将提供一些交通信息给你,你的任务是根据当前的交通情况回答查询的问题。交通信息可以分为以下几种格式:
Close r1 c1 r2 c2:相邻的两座城市(r1,c1)和(r2,c2)之间的道路被堵塞了;Open r1 c1 r2 c2:相邻的两座城
市(r1,c1)和(r2,c2)之间的道路被疏通了;Ask r1 c1 r2 c2:询问城市(r1,c1)和(r2,c2)是否连通。如果存在一
条路径使得这两条城市连通,则返回Y,否则返回N;

Input

  第一行只有一个整数C,表示网格的列数。接下来若干行,每行为一条交通信息,以单独的一行“Exit”作为
结束。我们假设在一开始所有的道路都是堵塞的。我们保证 C小于等于100000,信息条数小于等于100000。

Output

  对于每个查询,输出一个“Y”或“N”。

Sample Input

2
Open 1 1 1 2
Open 1 2 2 2
Ask 1 1 2 2
Ask 2 1 2 2
Exit

Sample Output

Y
N

【题目分析】
啊啊啊,我终于在题解的帮助下做出这道有(e)(e)(e)意(xin)(xin)(xin)思(ren)(ren)(ren)的题啦,之前看都不想看这道题,可是没有办法只能耐着性子看网上的题解,可是题解我觉得他们都觉得自己讲的挺详细,可是我看完还是一脸懵逼,又不想看代码。找来找去找了一个代码看起来挺好看的一个博客耐着性子看完后才算是大概理解了。
题目的意思应该挺好理解,不过需要注意的是题目中说修改的城市都是相邻的!!!我刚开始一直没有注意这个,觉得这个题没法做。
还是区间问题,要用万能的线段树解决的话,主要的问题是维护什么,不同于一般的线段树问题大都是一维的,这个问题是二维的,虽然只有两行,但是显然不是以前简单的区间就可以的。我们要维护的是矩形区间,叶子节点是一列两行的没有宽度的矩形,我们对于每个矩形维护四条边和两条对角线来记录矩形四个点之间的连通性关系。但是如果我们合并两个相邻的矩形,他们之间还有两条边,因此我们专门用一个数组来记录每列之间两条边的关系和上下两个城市的连通性。我们不妨记这个数组为LinkLinkLink,Link[i][0][0]Link[i][0][0]Link[i][0][0]对应第i列和i+1列第一行之间的连通性,Link[i][1][1]Link[i][1][1]Link[i][1][1]对应第i列和i+1列第二行之间的连通性,Link[i][0][1]Link[i][0][1]Link[i][0][1]对应第i列第一行与第二行之间的连通性。
然后我们用线段树维护区间的方法维护整个区间,修改两个城市之间的关系的时候先修改Link数组,然后根据Link数组单点修改。对于每次查询操作,我们分别得到[1,c1],[c1,c2],[c2,n][1,c1],[c1,c2],[c2,n][1,c1],[c1,c2],[c2,n]三个区间的矩形(用一个区间查询),然后根据这三个区间进行操作。
具体的看代码吧,嘿嘿嘿(露出了善(xie)(xie)(xie)良(e)(e)(e))的微笑。
照着大佬的博客敲都wa了四发,呜呜呜。线段树忘记开区间*4了,然后还有一个数字写错了。
【参考博客】
传送门
【AC代码】

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;
struct node
{int a1,a2,b1,b2,c1,c2;void init(){a1=a2=b1=b2=c1=c2=0;}
}mp[MAXN<<2];
int Link[MAXN][2][2];
int n; char cmd[10];
int r1,c1,r2,c2;node PushUp(node a,node b,int mid)
{node c;if(a.a1 || (a.b1&&Link[mid][0][0]&&b.a1&&Link[mid][1][1]&&a.b2))c.a1=1;else c.a1=0;if(b.a2 || (b.b1&&Link[mid][0][0]&&a.a2&&Link[mid][1][1]&&b.b2))c.a2=1;elsec.a2=0;if((a.b1&&Link[mid][0][0]&&b.b1) || (a.c1&&Link[mid][1][1]&&b.c2))c.b1=1;elsec.b1=0;if((a.b2&&Link[mid][1][1]&&b.b2) || (a.c2&&Link[mid][0][0]&&b.c1))c.b2=1;elsec.b2=0;if((a.b1&&Link[mid][0][0]&&b.c1) || (b.b2&&Link[mid][1][1]&&a.c1))c.c1=1;else c.c1=0;if((a.b2&&Link[mid][1][1]&&b.c2) || (b.b1&&Link[mid][0][0]&&a.c2))c.c2=1;else c.c2=0;return c;
}void build(int k,int l,int r)
{mp[k].init();if(l==r){mp[k].b1=mp[k].b2=1;return;}int mid=(l+r)>>1;build(k<<1,l,mid); build(k<<1|1,mid+1,r);//mp[k]=PushUp(mp[k<<1],mp[k<<1|1],mid);
}void Update(int k,int l,int r,int x)
{if(l==r && l==x){mp[k].b1=mp[k].b2=1;mp[k].a1=mp[k].a2=mp[k].c1=mp[k].c2=Link[x][0][1];return;}int mid=(l+r)>>1;if(x<=mid) Update(k<<1,l,mid,x);else Update(k<<1|1,mid+1,r,x);mp[k]=PushUp(mp[k<<1],mp[k<<1|1],mid);
}void Change(int x)
{if(c1==c2){Link[c1][0][1]=x;Update(1,1,n,c1);}else{int c=min(c1,c2);Link[c][r1][r1]=x;Update(1,1,n,c);}
}node Query(int k,int l,int r,int L,int R)
{if(l>=L && r<=R){return mp[k];}int mid=(l+r)>>1;node ret; ret.init();if(R<=mid) return Query(k<<1,l,mid,L,R);else if(L>mid) return Query(k<<1|1,mid+1,r,L,R);else return PushUp(Query(k<<1,l,mid,L,mid),Query(k<<1|1,mid+1,r,mid+1,R),mid);
}void Ask()
{if(c1>c2){swap(c1,c2); swap(r1,r2);}node l=Query(1,1,n,1,c1);node mid=Query(1,1,n,c1,c2);node r=Query(1,1,n,c2,n);if(r1==r2){if(r1==0){if(mid.b1 || (l.a2&&mid.c2) || (r.a1&&mid.c1) || (l.a2&&mid.b2&&r.a1)){printf("Y");}else{printf("N");}}else if(r1==1){if(mid.b2 || (l.a2&&mid.c1) || (r.a1&&mid.c2) || (l.a2&&mid.b1&&r.a1)){printf("Y");}else{printf("N");}}}else{if(r1==0){if(mid.c1 || (l.a2&&mid.b2) || (r.a1&&mid.b1) || (l.a2&&mid.c2&&r.a1)){printf("Y");}else{printf("N");}}else if(r1==1){if(mid.c2 || (l.a2&&mid.b1) || (r.a1&&mid.b2) || (l.a2&&mid.c1&&r.a1)){printf("Y");}else{printf("N");}}}printf("\n");
}int main()
{scanf("%d",&n);build(1,1,n);while(~scanf("%s",cmd) && cmd[0]!='E'){scanf("%d%d%d%d",&r1,&c1,&r2,&c2);r1--; r2--;if(cmd[0]=='O'){Change(1);}else if(cmd[0]=='C'){Change(0);}else{Ask();}}return 0;
}

BZOJ1018 | SHOI2008-堵塞的交通traffic——线段树维护区间连通性+细节相关推荐

  1. Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)

    这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...

  2. BZOJ[1018][SHOI2008]堵塞的交通traffic 线段树

    传送门ber~ 哇这个线段树好神啊!! 用线段树维护图连通性,每个节点开个二维数组 ai,j a i , j a_{i,j}表示这个区间最左面的第 i i i行能不能走到最右面的第j" ro ...

  3. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

  4. BZOJ1018: [SHOI2008]堵塞的交通traffic

    线段树维护每一块左上到左下.右上到右下.左上到右上.左下到右下.左上到右下.左下到右上的联通情况. upd:可以直接用3082的方法搞,能过. #include<bits/stdc++.h> ...

  5. BZOJ1018 [SHOI2008] 堵塞的交通traffic

    @(BZOJ)[线段树] Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个\(2\)行\(C\)列的矩形网格,网 ...

  6. bzoj1018[SHOI2008]堵塞的交通traffic

    题目链接:bzoj1018 题目大意: 一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路. 交通信息可以分为以下几种格式: Close ...

  7. Bzoj1018 [SHOI2008]堵塞的交通traffic

    Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 3458  Solved: 1158 Description 有一天,由于某种穿越现象作用,你来到了传说 ...

  8. BZOJ 1018: [SHOI2008]堵塞的交通traffic

    二次联通门 : BZOJ 1018: [SHOI2008]堵塞的交通traffic /*BZOJ 1018: [SHOI2008]堵塞的交通traffic麻麻这题玩我这题简直消磨人的意志写了一天了写一 ...

  9. Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)

    题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...

最新文章

  1. is not allowed to connect to this MySQL server解决办法
  2. HarmonyOS之常用布局PositionLayout的使用
  3. 直播预告:与九位专家聊聊Codec和AOM Summit
  4. zoj 2526(一道很好的最短路应用题)
  5. Ubuntu系统显卡驱动、CUDA、CUDNN安装(一显卡驱动)
  6. 【opencv】【第一玩】坤坤的篮球
  7. java string类型的初始化
  8. JS查漏补缺(自用版)
  9. 创建git 远程仓库 本地仓库 (Eclipse中使用)
  10. python 除法 保留2位小数
  11. PHP-基于ipip.net制作的IP查询接口源码
  12. java程序启动端口_查看项目端口和启动情况
  13. 确定性的丧失——20世纪新启蒙运动的来龙去脉
  14. 手把手教你注册谷歌账号 亲测有效 快来学
  15. 学籍管理系统c语言项目作业,C语言实现学生学籍管理系统
  16. SuperMap标注
  17. 测验6: 组合数据类型 (第6周) + 练习6: 组合数据类型 (第6周)
  18. 前端-CSS样式的简单介绍
  19. http keep-live
  20. 缓存更新脏读问题总结

热门文章

  1. (转)zabbix3.4使用percona-monitoring-plugins监控mysql
  2. Ajax与CustomErrors的尴尬
  3. hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)
  4. (接口)银联证书上传被修改的问题和读取证书的绝对路径问题
  5. 【BZOJ】【1041】【HAOI2008】圆周上的点
  6. 百度面试题:从输入url到显示网页,后台发生了什么?
  7. c 连接mysql.mwb_CodeSmith连接mysql提示“找不到请求的 .Net Framework Data Provider”的解决方法...
  8. mysql有子查询么_sql-带有子查询的mysql更新查询
  9. curl php 模拟来源_php 使用curl模拟ip和来源进行访问的实现方法
  10. 微型计算机广告牌实验报告,微型计算机实验报告1资料.doc