题目链接:bzoj1018
题目大意:
一个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。

题解:
线段树。。
线段树上的一个点维护相邻四个点的连通状况(就是[0][x],[1][x],[0][x+1],[1][x+1]这四个点),即以四个点为一个单位。
每次修改就更新被修改的两格所在的单位点的连通情况,然后从线段树的最底层更新上去。注意,修改上下两格的话要维护两个点。
询问的时候,首先判断两个点能否直接在它们所在区间里即[c1,c2-1]中相连。(为什么是c2-1?因为这个表示的是线段树里的区间。比如线段树的总区间只是[1,n-1]。因为四个点为一个单位点啊)
如果在区间里不能连通,那么就看看左边的点能不能从它的左边绕过来,右边的点能不能从右边绕过来,三种情况各自判断一下:1、左边绕回来后能否到右边的点;2、右边绕回来后能否到左边的点;3、左右都绕回来后能否相互到达。

然后。。我就打了5k。。。心力交瘁。。细节啊细节!!!

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 200010//0-左上下 1-上上 2-上下 3-下上 4-下下 5-右上下
struct node
{bool cn[6];node() {memset(cn,0,sizeof(cn));}
}tr[maxn];int len,rt;
int llc[maxn],rrc[maxn];
bool bo[2][maxn][2],bh[maxn];//0-左 1-右
node upd(node lc,node rc)
{node ret;if (lc.cn[0] || (lc.cn[1] && lc.cn[4] && rc.cn[0])) ret.cn[0]=true;if ((lc.cn[1] && rc.cn[1]) || (lc.cn[2] && rc.cn[3])) ret.cn[1]=true;if ((lc.cn[1] && rc.cn[2]) || (lc.cn[2] && rc.cn[4])) ret.cn[2]=true;if ((lc.cn[4] && rc.cn[3]) || (lc.cn[3] && rc.cn[1])) ret.cn[3]=true;if ((lc.cn[4] && rc.cn[4]) || (lc.cn[3] && rc.cn[2])) ret.cn[4]=true;if (rc.cn[5] || (lc.cn[5] && rc.cn[1] && rc.cn[4])) ret.cn[5]=true;return ret;
}
void based(int now,int x)
{memset(tr[now].cn,0,sizeof(tr[now].cn));if (bh[x] || (bo[0][x][1] && bh[x+1] && bo[1][x][1])) tr[now].cn[0]=true;if (bo[0][x][1] || (bh[x] && bh[x+1] && bo[1][x][1])) tr[now].cn[1]=true;if ((bo[0][x][1] && bh[x+1]) || (bh[x] && bo[1][x][1])) tr[now].cn[2]=true;if ((bh[x] && bo[0][x][1]) || (bo[1][x][1] && bh[x+1])) tr[now].cn[3]=true;if (bo[1][x][1] || (bh[x] && bh[x+1] && bo[0][x][1])) tr[now].cn[4]=true;if (bh[x+1] || (bo[0][x+1][0] && bh[x] && bo[1][x][1])) tr[now].cn[5]=true;
}
void change(int &now,int L,int R,int x)
{if (!now) now=++len;if (L==R) {based(now,x);return;}int mid=(L+R)>>1;if (x<=mid) change(llc[now],L,mid,x);else change(rrc[now],mid+1,R,x);tr[now]=upd(tr[llc[now]],tr[rrc[now]]);
}
node query(int &now,int L,int R,int l,int r)
{if (!now) now=++len;if (L==l && R==r) return tr[now];int mid=(L+R)>>1;if (r<=mid) return query(llc[now],L,mid,l,r);else if (l>mid) return query(rrc[now],mid+1,R,l,r);else{node lc=query(llc[now],L,mid,l,mid);node rc=query(rrc[now],mid+1,R,mid+1,r);return upd(lc,rc);}
}
int main()
{//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);int n,x1,x2,y1,y2;char s[10];scanf("%d\n",&n);rt=len=0;memset(bo,false,sizeof(bo));memset(bh,false,sizeof(bh));memset(llc,0,sizeof(llc));memset(rrc,0,sizeof(rrc));while (1){scanf("%s",s);if (s[0]=='E') break;if (s[0]=='O'){scanf("%d%d%d%d\n",&x1,&y1,&x2,&y2);x1--;x2--;if (y1>y2){int tt=x1;x1=x2;x2=tt;tt=y1;y1=y2;y2=tt;}if (y1==y2) {bh[y1]=true;if (y1!=1) change(rt,1,n-1,y1-1);if (y1!=n) change(rt,1,n-1,y1);}else {bo[x1][y1][1]=bo[x2][y2][0]=true;change(rt,1,n-1,y1);}}else if (s[0]=='C'){scanf("%d%d%d%d\n",&x1,&y1,&x2,&y2);x1--;x2--;if (y1>y2){int tt=x1;x1=x2;x2=tt;tt=y1;y1=y2;y2=tt;}if (y1==y2) {bh[y1]=false;if (y1!=1) change(rt,1,n-1,y1-1);if (y1!=n) change(rt,1,n-1,y1);}else {bo[x1][y1][1]=bo[x2][y2][0]=false;change(rt,1,n-1,y1);}}else{scanf("%d%d%d%d\n",&x1,&y1,&x2,&y2);x1--;x2--;if (y1>y2){int tt=x1;x1=x2;x2=tt;tt=y1;y1=y2;y2=tt;}if (y1==y2) {node lx;bool bk=false;bk|=bh[y1];if (y1!=1) {lx=query(rt,1,n-1,1,y1-1);bk|=lx.cn[5];}if (y1!=n) {lx=query(rt,1,n-1,y1,n-1);bk|=lx.cn[0];}if (bk) printf("Y\n");else printf("N\n");}else{node lx=query(rt,1,n-1,y1,y2-1);if (lx.cn[x1*2+x2+1]) {printf("Y\n");continue;}node zz,yy;if (y1!=1) zz=query(rt,1,n-1,1,y1-1);if (y2!=n) yy=query(rt,1,n-1,y2,n-1);if (x1==0 && x2==0){if (y1!=1 && zz.cn[5] && lx.cn[3]) {printf("Y\n");continue;}if (y2!=n && yy.cn[0] && lx.cn[2]) {printf("Y\n");continue;}if (y1!=1 && y2!=n && zz.cn[5] && yy.cn[0] && lx.cn[4]) {printf("Y\n");continue;}printf("N\n");continue;}if (x1==0 && x2==1){if (y1!=1 && zz.cn[5] && lx.cn[4]) {printf("Y\n");continue;}if (y2!=n && yy.cn[0] && lx.cn[1]) {printf("Y\n");continue;}if (y1!=1 && y2!=n && zz.cn[5] && yy.cn[0] && lx.cn[3]) {printf("Y\n");continue;}printf("N\n");continue;}           if (x1==1 && x2==0){if (y1!=1 && zz.cn[5] && lx.cn[1]) {printf("Y\n");continue;}if (y2!=n && yy.cn[0] && lx.cn[4]) {printf("Y\n");continue;}if (y1!=1 && y2!=n && zz.cn[5] && yy.cn[0] && lx.cn[2]) {printf("Y\n");continue;}printf("N\n");continue;}       if (x1==1 && x2==1){if (y1!=1 && zz.cn[5] && lx.cn[2]) {printf("Y\n");continue;}if (y2!=n && yy.cn[0] && lx.cn[3]) {printf("Y\n");continue;}if (y1!=1 && y2!=n && zz.cn[5] && yy.cn[0] && lx.cn[1]) {printf("Y\n");continue;}printf("N\n");continue;}}}}return 0;
}

bzoj1018[SHOI2008]堵塞的交通traffic相关推荐

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

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

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

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

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

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

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

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

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

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

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

    题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个22行CC列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所 ...

  7. [SHOI2008]堵塞的交通traffic

    线段树维护连通性... 通过分析我们可以发现,一个城市到另一个城市一共只有很少的几种情况 所以我们可以维护这个 2*X 矩形 判断其 从左上角到左下角 左上角到右上角 左上角到右下角 左下角到右上角 ...

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1018 题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q& ...

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

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

最新文章

  1. java的log4j的xml配置_Log4j配置实例(log4j.xml)
  2. 【深度学习】Tensorflow搭建卷积神经网络实现情绪识别
  3. Let's Encrypt 免费SSL配置
  4. TCP keepalive的详解(解惑)
  5. 提高虚拟机运行速度方法
  6. html filter 在线预览,HTML Filter
  7. 命名空间函数用法及例子
  8. Silverlight 结合WCF Duplex Service聊天程序出炉
  9. 科幻计算机类小说,短篇科幻小说推荐 | 黄金时代的五部科幻杰作
  10. 阿里巴巴高级技术专家:如何成为优秀的技术主管(下篇)
  11. 邮件安全证书(S/MIME),如何申请邮件证书
  12. sql 求和并且将求和条件作为查询条件
  13. react 购物车组件
  14. 13-cmake语法-路径设置
  15. gzip压缩文件损坏的修复方法
  16. 【源码】PDF.js批注注释插件库(纯JS). 创建和保存PDF批注(PDF 高亮/签名/插图/截屏/文本框/画笔/多边形)-pdf.js
  17. puppy linux 默认密码,puppy linux真的让我感觉眼前一亮!
  18. 【推荐实践】用户行为序列推荐模型
  19. 和自己对话--陶渊明《饮酒》
  20. 笔试真题解析 | 4.15携程实习笔试三道编程题

热门文章

  1. pyhton mechanize 学习笔记
  2. 通过python爬虫mechanize库爬取本机的ip地址
  3. 运行faiss时出现libmkl_avx2.so: undefined symbol: mkl_sparse_optimize_bsr_trsm_i8.
  4. Python的一句话“表白”
  5. 20个常识之最-不要说你5个都说不出来
  6. 2023基于微信小程序的社区小区团购电商在线商城平台(SSM+mysql)-JAVA.VUE(论文+开题报告+运行)
  7. 手机上的照片不小心删了怎么恢复的简单小技巧
  8. VS2010/MFC编程入门教程
  9. 云贝餐饮连锁V2 v2.5.7外卖/店内/预定/排号 餐饮外卖扫码点餐 智慧新零售
  10. win10亮度_win10系统不好用?学会这些基本操作技巧,小白也能变电脑高手