思路

同LOJ121

动态图连通性的板子

好像有很神的线段树做法,不会,先码住

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include <map>
#include <set>
#include <vector>
using namespace std;
const int MAXN = 100100;
int c,n,time,ans[MAXN],anscnt;
char s[MAXN];
inline int id(int rr,int cc){
return (rr-1)*c+cc;
}
struct uDSU{
int h[MAXN],fa[MAXN];
stack<int> height,mer;
int find(int x){
if(x==fa[x])
return x;
else
return find(fa[x]);
}
void merge(int x,int y){
x=find(x);
y=find(y);
if(h[x]<=h[y]){
fa[x]=y;
mer.push(x);
if(h[x]==h[y]){
h[y]++;
height.push(1);
}
else{
height.push(0);
}
}
else{
fa[y]=x;
mer.push(y);
height.push(0);
}
}
bool query(int x,int y){
return find(x)==find(y);
}
void undo(void){
int val=height.top();
height.pop();
int x=mer.top();
mer.pop();
h[fa[x]]-=val;
fa[x]=x;
}
void init(void){
for(int i=1;i<=n;i++)
h[i]=1,fa[i]=i;
}
}DSU;
map<pair<int,int>,int > M;
struct Node{
int le,u,v;
bool operator < (const Node &b) const{
return le<b.le;
}
};
vector<Node> seg[MAXN<<2];
void add(int L,int R,int l,int r,int o,int le,int u,int v){
if(L<=l&&r<=R){
seg[o].push_back((Node){le,u,v});
return;
}
int mid=(l+r)>>1;
if(L<=mid)
add(L,R,l,mid,o<<1,le,u,v);
if(R>mid)
add(L,R,mid+1,r,o<<1|1,le,u,v);
}
void dfs(int o,int l,int r){
sort(seg[o].begin(),seg[o].end());
for(int i=0;i<seg[o].size();i++)
if(seg[o][i].le==-1)
DSU.merge(seg[o][i].u,seg[o][i].v);
else
ans[seg[o][i].le]=DSU.query(seg[o][i].u,seg[o][i].v);
if(l!=r){
int mid=(l+r)>>1;
dfs(o<<1,l,mid);
dfs(o<<1|1,mid+1,r);
}
for(int i=0;i<seg[o].size();i++)
if(seg[o][i].le==-1)
DSU.undo();
}
int main(){
scanf("%d",&c);
n=c*2;
DSU.init();
scanf("%s",s);
while(s[0]!='E'){
++time;
int r1,c1,r2,c2;
scanf("%d %d %d %d",&r1,&c1,&r2,&c2);
int x=id(r1,c1),y=id(r2,c2);
if(x>y)
swap(x,y);
if(s[0]=='C'){
add(M[make_pair(x,y)],time,1,100010,1,-1,x,y);
M.erase(make_pair(x,y));
}
if(s[0]=='O'){
M[make_pair(x,y)]=time;
}
if(s[0]=='A'){
add(time,time,1,100010,1,++anscnt,x,y);
}
scanf("%s",s);
}
++time;
for(map<pair<int,int>,int >::iterator it=M.begin();it!=M.end();it++)
add((*it).second,time,1,100010,1,-1,(*it).first.first,(*it).first.second);
dfs(1,1,100010);
for(int i=1;i<=anscnt;i++)
printf("%s\n",(ans[i])?"Y":"N");
return 0;
}

P4246 [SHOI2008]堵塞的交通的更多相关文章

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

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

  2. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

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

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

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

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

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

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

  6. bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic

    http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...

  7. 【BZOJ1018】[SHOI2008]堵塞的交通

    [BZOJ1018][SHOI2008]堵塞的交通 题面 bzoj 洛谷 洛谷 题解 菊队讲要用线段树维护连通性,但是好像没人写 解法一 将所有的加边删边离线,然后以最近删除时间为边权,$LCT$维护 ...

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

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

  9. 【bzoj1018】[SHOI2008]堵塞的交通traffic

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

随机推荐

  1. Unity AssetBoundle 打包流程

    1.准备打包资源,给要打包的资源添加一个AssetBoundle名字 2.在Scripts文件夹下新建一个子文件夹,命名为Editor(注意名字不能写错),新建一个打包资源的C#类,命名为BuildA ...

  2. Marlin 擠出頭溫度控制PID值校正

    Marlin 擠出頭溫度控制PID值校正 擠出頭加熱器.溫度感應器安裝好後,先別急著直接指定工作溫度並且加熱.因為控制板上的溫度控制PID參數尚未校正.如果加熱速度過快,有可能會加熱過度並且導致零件燒 ...

  3. Locust 设置响应断言

    转:http://www.testclass.net/locust/assert/ 性能测试也需要设置断言么? 某些情况下是需要,比如你在请求一个页面时,就可以通过状态来判断返回的 HTTP 状态码是 ...

  4. greenplum presto impala选型与测评

    查看原文请至:https://my.oschina.net/hblt147/blog/1843028

  5. C# 复制值类型的变量和类

    C#大多数基元类型包括int.float.double.和char等,注意这里不包括string,这些都是值类型.将变量声明为值类型,编译器会生成代码来分配足以容纳这个值得内存块.编译器分配内存的时候 ...

  6. WebStorm: The Smartest JavaScript IDE by JetBrains

    WebStorm: The Smartest JavaScript IDE by JetBrains https://www.jetbrains.com/webstorm/?fromMenu

  7. Linux 执行程序 报错误:Permission denied.

    是对此文件所在位置没有权限导致的 chmod +x /home/yourfile 即可

  8. html5的理解

    1.良好的移动性,以移动设备为主 2.响应式设计,以适应自动变化的屏幕尺寸 3.支持离线缓存技术,webStorage本地缓存 4.新增canvas.video.audio等新标签元素,新增特殊内容元 ...

  9. mysql03

    查询的列不在同一表中必须使用连接内连接,外链接 -- 输出学生姓名以及对应的年级名称 内连接 select studentName,gradeName from student inner join ...

  10. php 版本号 整数化 mysql存储入库 比较大小【版本处理类,提供版本与数字互相转换】

    下载地址:https://download.csdn.net/download/a724008158/10659015