线段树维护连通性。。。

通过分析我们可以发现,一个城市到另一个城市一共只有很少的几种情况

所以我们可以维护这个 2*X 矩形

判断其 从左上角到左下角

     左上角到右上角

     左上角到右下角

     左下角到右上角

     左下角到右下角

     右上角到右下角

            的连通性

通过得到的连通性再判断即可

呆码:

#include<iostream>
#include<cstdio>
using namespace std;struct asd{bool luru,ldrd;bool lurd,ldru;bool luld,rurd;bool self[3];
} a[100010*4];
// l:left ; r:right ; u:up ; d:down
// 表示能否从一个角到另一个角 int r1,r2,c1,c2,n;inline asd pushup(asd x,asd y)
{asd ans;ans.luru=ans.ldrd=0;ans.lurd=ans.ldru=0;ans.luld=ans.rurd=0;ans.self[1]=y.self[1],ans.self[2]=y.self[2];if((x.luru && x.self[1] && y.luru) || (x.lurd && x.self[2] && y.ldru)) ans.luru=1;if((x.ldrd && x.self[2] && y.ldrd) || (x.ldru && x.self[1] && y.lurd)) ans.ldrd=1;if((x.luru && x.self[1] && y.lurd) || (x.lurd && x.self[2] && y.ldrd)) ans.lurd=1;if((x.ldrd && x.self[2] && y.ldru) || (x.ldru && x.self[1] && y.luru)) ans.ldru=1;if((x.luld) || (x.luru && x.self[1] && y.luld && x.self[2] && x.ldrd)) ans.luld=1;if((y.rurd) || (y.luru && x.self[1] && x.rurd && x.self[2] && y.ldrd)) ans.rurd=1;return ans;
}inline void build(int rt,int l,int r)
{if(l==r){a[rt].luru=a[rt].ldrd=1;return;}int mid=l+r>>1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);a[rt]=pushup(a[rt<<1],a[rt<<1|1]);
}inline void change1(int rt,int l,int r,int L,int k)
{if(l==r){a[rt].lurd=a[rt].ldru=a[rt].luld=a[rt].rurd=k;return;}int mid=l+r>>1;if(L<=mid) change1(rt<<1,l,mid,L,k);else change1(rt<<1|1,mid+1,r,L,k);a[rt]=pushup(a[rt<<1],a[rt<<1|1]);
}inline void change2(int rt,int l,int r,int L,int y,int k)
{if(l==r){a[rt].self[y]=k;return;}int mid=l+r>>1;if(L<=mid) change2(rt<<1,l,mid,L,y,k);else change2(rt<<1|1,mid+1,r,L,y,k);a[rt]=pushup(a[rt<<1],a[rt<<1|1]);
}inline asd query(int rt,int l,int r,int L,int R)
{if(L<=l && r<=R) { return a[rt]; }int mid=l+r>>1;asd ans1,ans2;bool left=0,right=0;if(L<=mid) ans1=query(rt<<1,l,mid,L,R),left=1;if(R>mid) ans2=query(rt<<1|1,mid+1,r,L,R),right=1;if(left==1 && right==1) return pushup(ans1,ans2);else return left==1 ? ans1 : ans2;
}inline bool check()
{if(c1>c2) { swap(c1,c2); swap(r1,r2); }asd pre=query(1,1,n,1,c1);asd now=query(1,1,n,c1,c2);asd nxt=query(1,1,n,c2,n);if(r1==r2){if(r1==1 && ((now.luru) || (pre.rurd && now.ldru) || (nxt.luld && now.lurd) || (pre.rurd && now.ldrd && nxt.luld))) return 1;if(r1==2 && ((now.ldrd) || (pre.rurd && now.lurd) || (nxt.luld && now.ldru) || (pre.rurd && now.luru && nxt.luld))) return 1;}else{if(r1==1 && ((now.lurd) || (pre.rurd && now.ldrd) || (nxt.luld && now.luru) || (pre.rurd && now.ldru && nxt.luld))) return 1;if(r1==2 && ((now.ldru) || (pre.rurd && now.luru) || (nxt.luld && now.ldrd) || (pre.rurd && now.lurd && nxt.luld))) return 1;}return 0;
}int main()
{scanf("%d",&n);build(1,1,n);while(1){char ch[10]; scanf("%s",ch);if(ch[0]=='E') break;scanf("%d%d%d%d",&r1,&c1,&r2,&c2);if(ch[0]=='O'){if(c1==c2) change1(1,1,n,c1,1);else change2(1,1,n,min(c1,c2),r1,1);}if(ch[0]=='C'){if(c1==c2) change1(1,1,n,c1,0);else change2(1,1,n,min(c1,c2),r1,0);}if(ch[0]=='A'){if(check()) printf("Y\n");else printf("N\n");}}return 0;
}

代码

转载于:https://www.cnblogs.com/zzzyc/p/9536282.html

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. FastThreadLocal
  2. 网页登陆验证之图片验证码
  3. oracle 序列的概念与使用步骤
  4. VB判断文件及目录的存在性
  5. 使用Hibernate的项目中对VO的理解
  6. WIFI的下一代:LIFI 可见光无线通信代替微波通信
  7. 设计模式之抽象工厂模式(Abstract Factory)
  8. 人人 新浪 木瓜移动 笔试
  9. 电脑重装系统如何远程控制电脑操作
  10. (python)爬虫----八个项目带你进入爬虫的世界
  11. Git通过SSH拉取报错kex_exchange_identification
  12. linux调试工具ipcs的深入分析
  13. MBProgressHUD等待框背景色与菊花等待框颜色修改
  14. matlab 画三维极值点,用Matlab找一组模拟波形的极值(含极大值、极小值、最大值)并在图中画出来...
  15. vi/vim滚动屏幕
  16. python中strip() 函数和 split() 函数的理解
  17. jsp案例:计算矩形、圆形面积
  18. 基于Simulink与GUI界面相结合的单相全桥整流、三相桥式整流、单相桥式半空整流、单相桥式不可控整流电路的仿真研究
  19. 关于克隆猴中中华华的12点你不知道的事
  20. FairyGUI Unity评估

热门文章

  1. 学python还有机会吗_此时此刻,拥有一套全方面学习Python的机会是怎样一种体验?...
  2. 数组的最长递减子序列java_求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}...
  3. figma客户端_小白的Figma入门手册
  4. 一周年工作总结--wfdb库使用
  5. “21天好习惯”第一期-16
  6. 【神经网络与深度学习摘要】第1章 绪论
  7. 大数据时代的回收生意经(淼一专访)
  8. Oracle和sqlserver数据类型对应
  9. Java mongo入门
  10. Hibernate一级缓存、二级缓存以及查询缓存的关系