http://www.lydsy.com/JudgeOnline/problem.php?id=1018

题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q<=100000)个操作,操作Open和Close是将格子的四个角相邻的城市连边或删边,操作Ask是询问两个城市是否连通

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
#define rdm(x, i) for(int i=ihead[x]; i; i=e[i].next)
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; } const int N=100005;
struct T { bool d[2][2], f[2]; T() { CC(d, 0); CC(f, 0); } }t[N<<2];
int n, a[N][4], tot;
#define lc x<<1
#define rc x<<1|1
#define lson l, mid, lc
#define rson mid+1, r, rc void upd1(T &x, int pos=-1) {
static bool ok[4][4];
CC(ok, 0);
if(pos==-1) {
if(x.d[0][0]) ok[0][2]=ok[2][0]=1;
if(x.d[0][1]) ok[0][3]=ok[3][0]=1;
if(x.d[1][0]) ok[1][2]=ok[2][1]=1;
if(x.d[1][1]) ok[1][3]=ok[3][1]=1;
if(x.f[0]) ok[0][1]=ok[1][0]=1;
if(x.f[1]) ok[2][3]=ok[3][2]=1;
}
else {
CC(x.d, 0);
CC(x.f, 0);
if(a[pos][0]) ok[0][2]=ok[2][0]=1;
if(a[pos][1]) ok[0][1]=ok[1][0]=1;
if(a[pos][2]) ok[1][3]=ok[3][1]=1;
if(a[pos][3]) ok[3][2]=ok[2][3]=1;
}
rep(i, 4) ok[i][i]=1;
rep(k, 4) rep(i, 4) if(ok[i][k]) rep(j, 4) if(ok[k][j]) ok[i][j]=1;
if(ok[0][1]) x.f[0]=1;
if(ok[0][2]) x.d[0][0]=1;
if(ok[0][3]) x.d[0][1]=1;
if(ok[2][3]) x.f[1]=1;
if(ok[1][2]) x.d[1][0]=1;
if(ok[1][3]) x.d[1][1]=1;
}
void pushup(T &x, T &l, T &r) {
x.d[0][0]=(l.d[0][0]&&r.d[0][0]) || (l.d[0][1]&&r.d[1][0]);
x.d[0][1]=(l.d[0][0]&&r.d[0][1]) || (l.d[0][1]&&r.d[1][1]);
x.d[1][0]=(l.d[1][0]&&r.d[0][0]) || (l.d[1][1]&&r.d[1][0]);
x.d[1][1]=(l.d[1][0]&&r.d[0][1]) || (l.d[1][1]&&r.d[1][1]);
x.f[0]=l.f[0] || (l.d[0][0]&&r.f[0]&&l.d[1][1]);
x.f[1]=r.f[1] || (r.d[0][0]&&l.f[1]&&r.d[1][1]);
}
void update(int pos, int l=1, int r=tot, int x=1) {
if(l==r) { upd1(t[x], pos); return; }
int mid=(l+r)>>1;
if(pos<=mid) update(pos, lson);
else update(pos, rson);
pushup(t[x], t[lc], t[rc]);
}
void ask(int L, int R, T &ret, int l=1, int r=tot, int x=1) {
if(L<=l && r<=R) { memcpy(ret.d, t[x].d, sizeof(ret.d)); memcpy(ret.f, t[x].f, sizeof(ret.f)); return; }
int mid=(l+r)>>1;
if(R<=mid) { ask(L, R, ret, lson); return; }
if(mid<L) { ask(L, R, ret, rson); return; }
T t1, t2;
ask(L, R, t1, lson);
ask(L, R, t2, rson);
pushup(ret, t1, t2);
}
void change(int x1, int y1, int x2, int y2, int f) {
if(y1==y2) {
if(y1==n) {
a[y1-1][3]=f;
update(y1-1);
}
else if(y1==1) {
a[y1][1]=f;
update(y1);
}
else {
a[y1-1][3]=f;
a[y1][1]=f;
update(y1-1);
update(y1);
}
}
else {
if(x1==0) a[y1][0]=f;
if(x1==1) a[y1][2]=f;
update(y1);
}
// T tt;
// ask(1, 1, tt); dbg(tt.d[0][0]); dbg(tt.d[0][1]); dbg(tt.d[1][0]); dbg(tt.d[1][1]); dbg(tt.f[0]); dbg(tt.f[1]);
// dbg(a[1][0]); dbg(a[1][3]);
}
void ask(int x1, int y1, int x2, int y2) {
if(x1==x2 && y1==y2) { puts("Y"); return; }
T l, r, mid;
if(y1==y2) {
if(y1==n) {
ask(1, tot, mid);
if(mid.f[1]) puts("Y");
else puts("N");
}
else if(y1==1) {
ask(1, tot, mid);
if(mid.f[0]) puts("Y");
else puts("N");
}
else {
ask(1, y1-1, l);
ask(y1, tot, r);
if(l.f[1] || r.f[0]) puts("Y");
else puts("N");
}
}
else {
if(y1-1>=1) ask(1, y1-1, l);
if(y2<=tot) ask(y2, tot, r);
ask(y1, y2-1, mid);
if(mid.d[x1][x2]) { puts("Y"); return; }
if(y1-1>=1 && l.f[1]) mid.f[0]=1;
if(y2<=tot && r.f[0]) mid.f[1]=1;
upd1(mid);
if(mid.d[x1][x2]) puts("Y");
else puts("N");
}
}
char s[10];
int main() {
read(n); tot=n-1;
while(scanf("%s", s), s[0]!='E') {
int x1=getint(), y1=getint(), x2=getint(), y2=getint(); --x1; --x2;
if(y1>y2) swap(x1, x2), swap(y1, y2);
if(s[0]=='O') change(x1, y1, x2, y2, 1);
else if(s[0]=='C') change(x1, y1, x2, y2, 0);
else ask(x1, y1, x2, y2);
}
return 0;
}

  


这题有很大可以吐槽的地方!!!!!!!!!!!!!!!!!!!!!!!!!!

首先这是一个坑,现在才来填平了....很早以前写的时候自己随便yy了一个类似lct一样的搞法(用并查集搞的lct...虽然没有路径压缩)交上去wa了...因为我是将整个图分层然后乱搞....

那时候看了一下题解发现是很神的线段树....然后敲了一下自己yy不过来了就放弃了....

然后之后某次我想填掉这个坑...可是按照自己yy的做发现不对于是又放弃...

然后是昨晚上我又来做QAQ发现其实挺好想的...就是维护一下连通嘛blabla的..于是愉快地1h吧不到敲好且过了样例且静态查错了下....竟然wa了QAQ于是造数据和暴力对拍....小数据全过.....于是找标程对拍....好不容易终于拍出了一组数据....可是.....这是n=2000的数据能调?于是返回到静态查错的状态来...可是似乎很累的原因?我就一直盯着屏幕和纸看呀看...输出调试拍呀拍...果然还是太弱了...拍到凌晨还没搞定....4h已废(这个伟大的故事告诉我们状态不好的时候不要想题QAQ更不要调试.............

果然是太弱了....于是今天中午来填坑(因为向root要到了数据...先评测了下...80分........于是再静态查了一下..立马发现了sb错......(果然还是要冷静+有精力才能肉眼拍完码农题啊QAQ)然后就a了》。。。

果然还是太弱....

题解:因为只有两行,因此状态可以设计为每个格子,所以只有c-1个格子(后边将c-1看做n),首先来分析只有一个格子的情况。显然要维护4个城市之间的连通性我直接floyd.....考虑多个格子连在一起的情况...如果我们要求[l, r]的城市的连通性(即[l, r-1]的格子,假设格子编号从1开始从左向右),那么可以用点什么东西维护一下整个区间的格子,则答案就是整个区间边界的4个点的连通性....发现了是不是都很相似,即求多个格子和一个格子都是取边界的4个点判断....而[l, r-1]是可以通过合并出来的...于是上线段树...orz(反正我是没yy出来线段树)即,对于[l, r]的格子(这个区间不是上边那个),我们假设有了中间一个点mid,则一定可以通过知道[l, mid], [mid+1, r]的连通性而推出[l, r]的连通性..(自己手推...)这样问题得到解决...

可是如果仅仅是向上边那样只找[l, r]的连通性来回答询问是不够的....因为可能[l, r]的左边界和右边界在[l, r]这个区间是没有边或是不连通的...但是可能在<=l的区间能找出一条路径使得l的左边界连通,所以我们再查询[1, l-1],看看l-1这个格子的右边界是否连通就能知道l这个格子的左边界了...r同理.....

最后提示一点,也就是我的sb错,千万要注意序号....就是城市与格子序号之间的关系...即第x列格子对应的格子可能有x-1和x这个格子..

【BZOJ】1018: [SHOI2008]堵塞的交通traffic的更多相关文章

  1. 数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2638  Solved: 864 Descri ...

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

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2247  Solved: 706[Submit ...

  3. BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3064  Solved: 1027[Submi ...

  4. [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】

    题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...

  5. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 用线段树维护区间连通性,对于每一个区间记录6个域表示(左上,左下)(左上,右上)(右上, ...

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

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

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

    1018: [SHOI2008]堵塞的交通traffic 链接 分析: 用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可. 六种情况左上到右上(左边到右边的情况)… ...

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

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

  9. BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)

    题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...

随机推荐

  1. linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略 ...

  2. 【Hibernate】Hibernate系列7之二级缓存

    二级缓存 7.1.概述 7.2.配置方法

  3. maven项目 Java compiler level does not match the version of the installed Java project facet

    因工作的关系,Eclipse开发的Java项目拷来拷去,有时候会报一个很奇怪的错误.明明源码一模一样,为什么项目复制到另一台机器上,就会报“java compiler level does not m ...

  4. global-local-static-object

    [本文链接] http://www.cnblogs.com/hellogiser/p/global-local-static-object.html [分析] 1.生命周期问题:static变量在固定 ...

  5. Android studio 程序升级和sdk manager 升级方法

    在中国使用android有点郁闷,经常被屏蔽.常遇到2个升级问题,现在总结如下:  1.android studio升级时提示 Connection failed. Please check your ...

  6. Linux下挂载NTFS格式的U盘或硬盘

    我们知道在Linux下挂载fat32的U盘非常容易,使用mount /dev/drive_name /mnt/指定目录这样就可以挂载了,但是如果U盘或者硬盘的格式是NTFS的话,那么Linux是不能识 ...

  7. 用php实现遍历目录

    用php实现的遍历目录,只遍历第一层,如果制作在线文件管理器的话很管用,不同目录只加一个超链接就行了,然后给方法传递参数就行了,遍历目录的类如下: class Ergodic{ public func ...

  8. 完善DriveInfoEx源代码 获取计算机硬盘序列号

    概述: 获取计算机硬盘序列号用途很多,在网上找到了一个C++的源代码DriveInfoEx(点这里查看).非常好的一个DLL,.NET项目可以直接引用,而且源代码里有示例. 但这个DLL在Win7非管 ...

  9. Popular Cows(codevs 2186)

    题意: 有N(N<=10000)头牛,每头牛都想成为most poluler的牛,给出M(M<=50000)个关系,如(1,2)代表1欢迎2,关系可以传递,但是不可以相互,即1欢迎2不代表 ...

  10. 前端代理nproxy

    一.场景/用途 前端代理的用途,相信大家都清楚.应用场景很多,如—— . 将线上的静态资源文件(JS.CSS.图片)替换为本地相应的文件,来调试线上(代码都被压缩过)的问题: . 本地开发过程,当后端 ...