好神的线段树题,以前只会维护区间什么数值信息的,竟然还可以维护联通性,好题啊,涨姿势了。。

由于只有两行嘛,要保证线段树节点有可加性,我们维护六个信息,分别是右上到右下,右上到左上,右上到左下,右下到左上,右下到左下,左上到左下的联通性,合并的时候自己YY一下,还是很好想的。一点要注意的,父节点的左上到左下不能简单的直接把左儿子的值赋上去,还有可能是左走到右再走回来,右上右下的同理。。然后就是获取答案的时候,不一定就是在[L,R]这个区间里走,有可能会出现像R向右绕一个弯再走过去这样的情况,所以要把[1,L][L,R][R,n]三个区间的联通性都获取。。细节还是很多的。。

#include<cstdio>
#include<iostream>
#include<memory.h>
#define lc x*2
#define rc x*2+1
#define N 400405
using namespace std;
int n,x1,y1,x2,y2,qd,ans,ansl,ansr;
bool l12[N],r12[N],lr1[N],lr2[N],l1r2[N],l2r1[N],a[N][2][2];//a数组0向下1向右
char s[10];
void build(int x,int l,int r)
{if (l==r){lr1[x]=lr2[x]=true;return;}build(lc,l,(l+r)>>1);build(rc,(l+r)/2+1,r);
}
void update(int x,int mid,int lcc,int rcc)
{l12[x]=l12[lcc]||(lr1[lcc]&&a[mid][0][1]&&l12[rcc]&&a[mid][1][1]&&lr2[lcc]);r12[x]=r12[rcc]||(lr1[rcc]&&a[mid][0][1]&&r12[lcc]&&a[mid][1][1]&&lr2[rcc]);lr1[x]=(lr1[lcc]&&a[mid][0][1]&&lr1[rcc])||(l1r2[lcc]&&a[mid][1][1]&&l2r1[rcc]);lr2[x]=(lr2[lcc]&&a[mid][1][1]&&lr2[rcc])||(l2r1[lcc]&&a[mid][0][1]&&l1r2[rcc]);l1r2[x]=(lr1[lcc]&&a[mid][0][1]&&l1r2[rcc])||(l1r2[lcc]&&a[mid][1][1]&&lr2[rcc]);l2r1[x]=(lr2[lcc]&&a[mid][1][1]&&l2r1[rcc])||(l2r1[lcc]&&a[mid][0][1]&&lr1[rcc]);
}
void change(int x,int l,int r,int x1,int y1,int x2,int y2,bool k)
{int mid=(l+r)/2;if (y1==y2) {if (l==r) {a[y1][0][0]=k;l12[x]=r12[x]=l1r2[x]=l2r1[x]=k;return;}if (y1<=mid) change(lc,l,mid,x1,y1,x2,y2,k);else change(rc,mid+1,r,x1,y1,x2,y2,k);update(x,mid,lc,rc);}else{a[y1][x1][1]=k;if (mid==y1&&mid+1==y2) update(x,mid,lc,rc);else{if (mid>=y2) change(lc,l,mid,x1,y1,x2,y2,k);else change(rc,mid+1,r,x1,y1,x2,y2,k);update(x,mid,lc,rc);}}
}
int query(int x,int l,int r,int y1,int y2)
{if (y1<=l&&y2>=r) return x;int mid=(l+r)>>1;if (y2<=mid) return query(lc,l,mid,y1,y2);else if (y1>mid) return query(rc,mid+1,r,y1,y2);else{int ans=++qd,lcc=query(lc,l,mid,y1,mid),rcc=query(rc,mid+1,r,mid+1,y2);update(ans,mid,lcc,rcc);return ans;}
}
int main()
{freopen("1018.in","r",stdin);
//  freopen("1018.out","w",stdout);scanf("%d",&n);memset(a,0,sizeof(a));memset(l12,0,sizeof(l12));memset(r12,0,sizeof(r12));memset(lr1,0,sizeof(lr1));memset(lr2,0,sizeof(lr2));memset(l2r1,0,sizeof(l2r1));memset(l1r2,0,sizeof(l1r2));build(1,1,n);int t=1;while (t++){scanf("%s",&s);if (s[0]=='E') return 0;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);if (y1>y2) swap(y1,y2),swap(x1,x2);   x1--;x2--;if (s[0]=='O') change(1,1,n,x1,y1,x2,y2,true);else if (s[0]=='C') change(1,1,n,x1,y1,x2,y2,false);else {qd=400000;ans=query(1,1,n,y1,y2);ansl=query(1,1,n,1,y1);ansr=query(1,1,n,y2,n);if ((x1==0&&x2==0&&(lr1[ans]||(r12[ansl]&&l2r1[ans])||(l12[ansr]&&l1r2[ans])||(r12[ansl]&&l12[ansr]&&lr2[ans])))||(x1==1&&x2==1&&(lr2[ans]||(r12[ansl]&&l1r2[ans])||(l12[ansr]&&l2r1[ans])||(r12[ansl]&&l12[ansr]&&lr1[ans])))||(x1==0&&x2==1&&(l1r2[ans]||(r12[ansl]&&lr2[ans])||(l12[ansr]&&lr1[ans])))||(x1==1&&x2==0&&(l2r1[ans]||(r12[ansl]&&lr1[ans])||(l12[ansr]&&lr2[ans])))) printf("Y\n"); else printf("N\n");}}
}

[BZOJ1018]SHOI2008堵塞的交通|线段树相关推荐

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

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

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

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

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

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

  4. BZOJ1018 堵塞的交通(线段树)

    题目很好明白,然后实现很神奇.首先如果考虑并查集的话,对于删边和加边操作我们无法同时进行.然后暴力分块的话,复杂度是O(n sqrt n) ,不是很优.于是看了题解,发现了线段树的神奇用途. 我们维护 ...

  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. [bzoj1018] [SHOI2008]堵塞的交通

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

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

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

最新文章

  1. 【Java】排序算法 之 【归并排序】 总结
  2. c#操作Word文件 导出数据到word文档 (table 书签方式)
  3. 机虚拟磁盘附加到计算机上,解决在NAS的共享文件夹下的VHDX虚拟磁盘无法附加到系统...
  4. [WinAPI] API 11 [创建目录]
  5. nginx 访问控制 防盗链
  6. python模块 - re模块使用演示样例
  7. 通过onActivityResult()先跳转到联系人界面,然后把传回来的手机号显示到应用的EditText上...
  8. 两张趣图助你理解 HTTP 状态码
  9. 分布式系统的开发经验与心得
  10. es6 WeakMap
  11. 直播预告丨 Oracle 12C~19C统计信息的最佳实践
  12. java8 Stream2
  13. poj3159 Candies
  14. 推荐6本React在线电子版书籍
  15. Docker制作深度学习镜像常用操作
  16. Linux获取外网IP
  17. 解码jpg图片c语言,图像解码之一——使用libjpeg解码jpeg图片
  18. SSH框架之理解Spring的IOC反转控制DI依赖注入--入门小实例
  19. ajax dojo deferred,Dojo学习-14:Ajax with dojo/request
  20. WebStorm调试

热门文章

  1. 使用Mechanize实现自动化表单处理
  2. vue+video.js实现视频播放列表
  3. 祭奠我那失去的青春--故游柞水(一、我那迷茫的青春年代)
  4. 吃透Chisel语言.36.Chisel实战之以FIFO为例(一)——FIFO Buffer和Bubble FIFO的Chisel实现
  5. 最新2023基于微信小程序的社区小区团购电商在线商城平台(SSM+mysql)-JAVA.VUE【数据库设计、论文、毕设源码、开题报告】
  6. Cesium glsl 学习
  7. opencv监测微信发送通知
  8. 一些管理方面的观察和思考
  9. C#编写Windows服务程序 (服务端),客户端使用 消息队列 实现淘宝 订单全链路效果
  10. android表情符号使用,关于android:表情符号符号?? 在string.xml中使应用程序崩溃