题目描述

有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可
以被看成是一个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;

题解

这么**的题我居然能一A。。。

我写的比较麻烦,用二元组[0/1][0/1]来表示当前矩形的四个角,再去维护每个小矩形,线段树维护合并后的大矩形。

讨论比较恶心。。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 100009
using namespace std;
char s[10];
int n;
inline int rd(){int x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}
struct node{bool a[2][2][2][2];node operator +(const node &b)const{node c;c.a[0][0][0][1]=(a[0][0][1][1]&&b.a[1][0][0][1])||(a[0][0][0][1]&&b.a[0][0][0][1]);c.a[0][0][1][0]=(a[0][0][1][0])||(a[0][0][0][1]&&b.a[0][0][1][0]&&a[1][0][1][1]);c.a[0][0][1][1]=(a[0][0][1][1]&&b.a[1][0][1][1])||(a[0][0][0][1]&&b.a[0][0][1][1]);c.a[1][0][0][1]=(a[1][0][1][1]&&b.a[1][0][0][1])||(a[1][0][0][1]&&b.a[0][0][0][1]);c.a[1][0][1][1]=(a[1][0][1][1]&&b.a[1][0][1][1])||(a[1][0][0][1]&&b.a[0][0][1][1]);c.a[0][1][1][1]=(b.a[0][1][1][1])||(a[0][1][1][1]&&b.a[0][0][0][1]&&b.a[1][0][1][1]);return c;}inline void clear(){memset(a,0,sizeof(a));}inline void print(){cout<<a[0][0][0][1]<<" "<<a[1][0][1][1]<<" "<<a[0][0][1][1]<<" "<<a[0][0][1][0]<<" "<<a[0][1][1][1]<<" "<<a[1][0][0][1]<<endl;}
}now[N];
struct seg{node val;int ls,rs;
}tr[N<<1];
int tot=1;
void build(int cnt,int l,int r){if(l==r)return;int mid=(l+r)>>1;tr[cnt].ls=++tot;tr[cnt].rs=++tot;build(tr[cnt].ls,l,mid);build(tr[cnt].rs,mid+1,r);
}
void upd(int cnt,int l,int r,int tag,int x,int y){if(l==r){if(tag<2)now[l].a[tag][0][tag][1]=y;else now[l].a[0][tag-2][1][tag-2]=y;tr[cnt].val.clear();tr[cnt].val.a[0][0][1][0]=now[l].a[0][0][1][0]||(now[l].a[0][0][0][1]&&now[l].a[0][1][1][1]&&now[l].a[1][0][1][1]);tr[cnt].val.a[0][0][0][1]=now[l].a[0][0][0][1]||(now[l].a[0][0][1][0]&&now[l].a[1][0][1][1]&&now[l].a[0][1][1][1]);tr[cnt].val.a[0][0][1][1]=(now[l].a[0][0][0][1]&&now[l].a[0][1][1][1])||(now[l].a[0][0][1][0]&&now[l].a[1][0][1][1]);tr[cnt].val.a[1][0][0][1]=(now[l].a[0][0][1][0]&&now[l].a[0][0][0][1])||(now[l].a[1][0][1][1]&&now[l].a[0][1][1][1]);tr[cnt].val.a[1][0][1][1]=(now[l].a[1][0][1][1])||(now[l].a[0][0][1][0]&&now[l].a[0][0][0][1]&&now[l].a[0][1][1][1]);tr[cnt].val.a[0][1][1][1]=(now[l].a[0][1][1][1])||(now[l].a[0][0][0][1]&&now[l].a[0][0][1][0]&&now[l].a[1][0][1][1]);//    cout<<l<<" ";tr[cnt].val.print();return;}int mid=(l+r)>>1;if(mid>=x)upd(tr[cnt].ls,l,mid,tag,x,y);else upd(tr[cnt].rs,mid+1,r,tag,x,y);tr[cnt].val=tr[tr[cnt].ls].val+tr[tr[cnt].rs].val;
}
node _query(int cnt,int l,int r,int x,int tag){if(l==r){node x;int xx=tr[cnt].val.a[0][tag][1][tag];x.a[0][0][0][1]=x.a[1][0][1][1]=1;x.a[0][0][1][1]=x.a[0][0][1][0]=x.a[0][1][1][1]=x.a[1][0][0][1]=xx;return x;}int mid=(l+r)>>1;if(mid>=x)return _query(tr[cnt].ls,l,mid,x,tag);else return _query(tr[cnt].rs,mid+1,r,x,tag);
}
node query(int cnt,int l,int r,int L,int R){if(L>R)return node();if(l>=L&&r<=R)return tr[cnt].val;int mid=(l+r)>>1;if(mid>=L&&mid<R)return query(tr[cnt].ls,l,mid,L,R)+query(tr[cnt].rs,mid+1,r,L,R);else if(mid>=L)return query(tr[cnt].ls,l,mid,L,R);else return query(tr[cnt].rs,mid+1,r,L,R);
}
int main(){n=rd();build(1,1,n-1);int r1,r2,x,y;while(1){scanf("%s",s);if(s[0]=='E')break;r1=rd();x=rd();r2=rd();y=rd();r1--;r2--;if(x>y)swap(x,y),swap(r1,r2);if(s[0]=='C'){if(x==y){if(x!=n)upd(1,1,n-1,2,x,0);if(x>1)upd(1,1,n-1,3,x-1,0);}else upd(1,1,n-1,r1,min(x,y),0);}else if(s[0]=='O'){if(x==y){if(x!=n)upd(1,1,n-1,2,x,1);if(x>1)upd(1,1,n-1,3,x-1,1);}else upd(1,1,n-1,r1,min(x,y),1);}else{bool ans=0;node xx=query(1,1,n-1,x,y-1),x1=query(1,1,n-1,1,x-1),x2=query(1,1,n-1,y,n-1);if(x==y)xx=_query(1,1,n-1,x==1?x:x-1,x==1?0:1);//        xx.print();x1.print();x2.print();if(r1){if(r2){if(xx.a[1][0][1][1])ans=1;if(x1.a[0][1][1][1]&&x2.a[0][0][1][0]&&xx.a[0][0][0][1])ans=1;}else{if(xx.a[1][0][0][1])ans=1;if(x1.a[0][1][1][1]&&xx.a[0][0][0][1])ans=1;if(x2.a[0][0][1][0]&&xx.a[1][0][1][1])ans=1;}}else{if(r2){if(xx.a[0][0][1][1])ans=1;if(x1.a[0][1][1][1]&&xx.a[1][0][1][1])ans=1;if(x2.a[0][0][1][0]&&xx.a[0][0][0][1])ans=1;}else{if(xx.a[0][0][0][1])ans=1;if(x1.a[0][1][1][1]&&x2.a[0][0][1][0]&&xx.a[1][0][1][1])ans=1;}}if(ans)puts("Y");else puts("N"); }}return 0;
}

转载于:https://www.cnblogs.com/ZH-comld/p/10451722.html

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

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

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

  2. Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)

    P4246 [SHOI2008]堵塞的交通 题意 题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个\(2\)行\(C\)列的矩形 ...

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

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

  4. 洛谷 P4246 [SHOI2008]堵塞的交通 线段树

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

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

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

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

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

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

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

  8. [SHOI2008]堵塞的交通traffic

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

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

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

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

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

最新文章

  1. Access ADO多连接时数据延迟无法同步无法及时更新的解决办法
  2. MapxTreme2008的打包过程
  3. java 程序执行后 强制gc_【GC系列】JVM的常用GC参数及GC日志解析
  4. bash: jps: command not found
  5. [转]动态加载jar文件
  6. ACM比赛技巧之文件数据输入与输出
  7. ssm框架requestmapping找不到_从MVC原理开始手敲一个MVC框架,带你体会当大神的乐趣...
  8. JavaScript:判断当前浏览器是否为微信浏览器
  9. 计算机单机考试,信息技术考试系统(单机版)
  10. QQ大盗 - 巧用clientkey
  11. 目前已完成linux适配的软件,WPS Linux版与国产统一操作系统UOS完成适配:体验追上Wintel...
  12. 【JSOI2015】bzoj4487 染色问题
  13. 在Windows Server 2012中搭建WEB服务器,附ASP配置方法
  14. WIN7下恼人的AppData——删除无用的缓存文件
  15. 金彩教育:提升产品标签的方法
  16. php 获取文章内容首图,关于文章的首图及图片版权问题
  17. http报文格式简介
  18. 梯度下降与反向传播算法的原理与推导
  19. Siege 简单教程
  20. 基于 Mesh 的统一路由在海外业务的实践

热门文章

  1. python-next
  2. oracle数据库恢复aul_Oracle数据库救命恢复工具:gDUL3.0
  3. 神经网络的Dropout的理解
  4. 浅谈volatile的原理
  5. python监听文件更改记录_同事利用Python制作微信机器人自动监控群聊!
  6. 如何查看Ubuntu的内核是AMD、ARM、x86、x86_64
  7. eoe android 短信长度限制 70,为什么手机短信要限定70个汉字?其实答案在这里!...
  8. mysql创建gbk库_MYSQL创建utf-8和GBK格式数据库_MySQL
  9. 基于springboot的社区核酸检测统计管理系统
  10. 华为 台积电 高通申请_华为表态愿意合作,台积电送来“神助攻”,高通:我太难了...