BZOJ1018 [SHOI2008]堵塞的交通traffic && 2459: [BeiJing2011]神秘好人 (含datamaker)

bzoj 1018 堵塞的交通traffic (线段树) 题意: 思路: 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html         非常非常难写的线段树,不仅难想还难写。         首先,这个线段树维护的是什么,是该区域四个顶点的连通性  ... 阅读详情

题目

BZOJ1018 [SHOI2008]堵塞的交通traffic
BZOJ2459: [BeiJing2011]神秘好人

这两道题思路相仿所以放在一起

1018 题解

沃日啊代码毒瘤啊(不过好像没有想像中毒瘤?),写了一天多。
主要思想就是用线段树每个节点维护区间边界的四个点的连通信息,然后合并就是跑一遍只有八个点的无向图获取便边界四个点连通性。注意这里维护的信息只是通过内部节点的边。

回答询问的时候需要询问三个区间(c1 < c2),,[c1,c2] [1,c1],[c2,n],注意可以从两边绕过去,不一定只用[c1,c2]区间的边,一共有两种情况,同行,不同行,判一下就行了。

之前用的G[4][4]表示连通性,每次up就跑一遍8个点的floyd,然后T了,我居然还没一眼看出来为什么,8^3不爆炸才怪,然后改成用6个变量直接维护就变成近似O(1)了?up的时候讨论一下是从中间哪条边过去的就行了。

应该有WA不止的同学吧。放一个datamaker,但是这个东西造大数据的时候很慢,因为方法拙劣无比,操作数2000就差不多要造1s了。不过造小数据才能手调嘛。

1018 题目代码

//QWsin
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x) for(int i=0;i<x;++i)
using namespace std;
const int maxn=100000+10;
const char msg[]={'N','Y'};
inline int read()
{
    int ret=0;char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    for(;ch>='0'&&ch<='9';ch=getchar()) ret=ret*10+ch-'0';
    return ret; 
}

int ok[maxn][2][2];//ok[i][j][k]表示i列j层往k方向连是否有边
//  0 * 1
//0...2 (4...6)
//1...3 (5...7)

struct NodeG{
    int g01,g02,g03,g12,g13,g23,l,r;
    NodeG(int l=0,int r=0):l(l),r(r){
        g01=g02=g03=g12=g13=g23=0;
    }
    NodeG operator + (const NodeG &rhs)const{
        NodeG t(l,rhs.r);

        int t1=ok[r][1][1],t2=ok[r][2][1];

        if(g01 || (g02&&rhs.g01&&g13&&t1&&t2)) t.g01=1;
        if((g02&&t1&&rhs.g02)||(g03&&t2&&rhs.g12)) t.g02=1;
        if((g02&&t1&&rhs.g03)||(g03&&t2&&rhs.g13)) t.g03=1;
        if((g12&&t1&&rhs.g02)||(g13&&t2&&rhs.g12)) t.g12=1;
        if((g12&&t1&&rhs.g03)||(g13&&t2&&rhs.g13)) t.g13=1;
        if((g23&&rhs.g02&&rhs.g13&&t1&&t2) || rhs.g23) t.g23=1;

        return t;
    }
};

#define mid ((l+r)>>1)
struct Node{
    NodeG g;//存放联通情况
    Node *lc,*rc;
    Node(int l,int r){lc=rc=NULL;g=NodeG(l,r);}
    inline void up(){g=lc->g+rc->g;}
}*root;

void build(Node* &p,int l,int r){
    p=new Node(l,r); 
    if(l==r) {p->g.g02=p->g.g13=1;return ;}//这两项是单列固定信息不会更改 
    build(p->lc,l,mid);build(p->rc,mid+1,r);p->up();
}

//竖列更新信息(单点修改)
void updata1(Node *p,int l,int r,int pos,int val)
{
    if(l==r){
        p->g.g01=p->g.g23=val;
        p->g.g03=p->g.g12=val;
        return ;
    }
    if(pos<=mid) updata1(p->lc,l,mid,pos,val);
    else updata1(p->rc,mid+1,r,pos,val);p->up();
}
//找到加边后影响到的合并(即加边位置为它的mid的那个区间),从这里开始重新合并
void updata2(Node *p,int l,int r,int pos,int val)
{
    if(mid==pos) {p->up();return ;}
    if(mid > pos) updata2(p->lc,l,mid,pos,val);
    else updata2(p->rc,mid+1,r,pos,val);
    p->up();
}

NodeG query(Node *p,int l,int r,int L,int R)
{
    if(L<=l&&r<=R) return p->g;
    if(R<=mid) return query(p->lc,l,mid,L,R);
    else if(mid<L) return query(p->rc,mid+1,r,L,R);
    else return query(p->lc,l,mid,L,R)+query(p->rc,mid+1,r,L,R);
}

int t1[4][4],t2[4][4],t3[4][4];

int n;
inline void query(int L,int R,int G[4][4])//复制一遍是因为按原来的邻接矩阵的方法,判断答案要方便一些,因为r1,c1,r2,c2都是变量
{
    NodeG t=query(root,1,n,L,R);
    G[0][1]=G[1][0]=t.g01;
    G[0][2]=G[2][0]=t.g02;
    G[0][3]=G[3][0]=t.g03;
    G[1][2]=G[2][1]=t.g12;
    G[1][3]=G[3][1]=t.g13;
    G[2][3]=G[3][2]=t.g23;
}

char op[20];
//询问只通过内部的点是否能连通(r1,c1)~(r2,c2) 

int main()
{
    cin>>n;
    build(root,1,n);

    int r1,c1,r2,c2;
    while(1)
    {
        scanf("%s",op);
        if(op[0]=='E') break;
        if(op[0]=='A') 
        {
            r1=read();c1=read();r2=read();c2=read();
            if(c1>c2) swap(c1,c2),swap(r1,r2);

            if(r1==1&&c1==1&&r2==2&&c2==3){
                int stop=1; 
            }

            if(r1==r2&&c1==c2) {printf("Y\n");continue;}

            query(c1,c2,t1);
            query( 1,c1,t2);
            query(c2, n,t3);

            int ans=t1[r1-1][r2+1];

            if(r1==r2){if(t2[2][3]&&t1[2-r1][4-r2]&&t3[0][1]) ans=1;}
            else{
                if(t2[2][3]&&t1[2-r1][1+r2]) ans=1;
                if(t3[0][1]&&t1[r1-1][4-r2]) ans=1;
            }
            putchar(msg[ans]);putchar('\n');
        }
        else
        {
            int val=op[0]=='O';
            r1=read();c1=read();r2=read();c2=read();
            if(r1==r2)
            {
                if(c1>c2)swap(c1,c2);
                ok[c1][r1][1]=ok[c2][r1][0]=val;
                updata2(root,1,n,c1,val);
            }
            else updata1(root,1,n,c1,val);
        }
    }
    return 0;
}

1018 datamaker

//QWsin
#include<set>
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int n;

struct Road{
    int r1,c1,r2,c2;    
    Road(int r1,int c1,int r2,int c2):r1(r1),c1(c1),r2(r2),c2(c2){}
    bool operator < (const Road &rhs)const{
        if(r1!=rhs.r1) return r1<rhs.r1;
        if(c1!=rhs.c1) return c1<rhs.c1;
        if(r2!=rhs.r2) return r2<rhs.r2;
        return c2<rhs.c2;
    }
    inline void output(){
        printf("%d %d %d %d\n",r1,c1,r2,c2);    
    }
};

Road getRoad()
{
    int dir=rand()%2;
    if(dir)
    {
        int r=rand()%2+1;
        int c=rand()%(n-1)+1;
        return Road(r,c,r,c+1);
    }
    else
    {
        int c=rand()%n+1;
        return Road(1,c,2,c);
    }
}

set<Road>Roadset;

int main()
{
    srand(time(0));
    n=rand()*rand()%3+2;//点数
    printf("%d\n",n);
    int Roadcnt=0;
    for(int i=1;i<=20;++i)//20是操作数
    {
        int kind=rand()%3;
        if(kind==0&&Roadcnt==3*n-2) continue;
        if(kind==1&&Roadcnt==0) continue;

        if(kind==0)
        {
            printf("Open ");
            Road t=getRoad();
            while(Roadset.count(t)) t=getRoad();
            t.output();
            Roadset.insert(t);++Roadcnt;
        }
        else if(kind==1)
        {
            printf("Close ");
            Road t=getRoad();
            while(!Roadset.count(t)) t=getRoad();
            t.output();
            Roadset.erase(t);--Roadcnt;
        }
        else
        {
            printf("Ask ");
            int r1=rand()%2+1,r2=rand()%2+1;
            int c1=rand()%n+1,c2=rand()%n+1;
            printf("%d %d %d %d\n",r1,c1,r2,c2);
        }
    }
    printf("Exit");
    return 0;
}

2459 题解

其实跟上道题差不多,但是莫名其妙调了很久,关键就在于对于每个询问考虑的情况还要多一些,局限于上一道题的方法,所以大数据一直WA。

这道题要问最短路所以非得用邻接矩阵然后跑floyd了。所以常数好像很大。
询问的时候要枚举完最短路出现的情况,要不然会GG。

2459 题目代码

//QWsin
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x) for(int i=0;i<x;++i)
using namespace std;
typedef long long ll;
const ll INF=1ll<<60;
const int maxn=100000+10;
const char msg[][10]={"N","Y"};
inline int read()
{
    int ret=0;char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    for(;ch>='0'&&ch<='9';ch=getchar())ret=ret*10+ch-'0';
    return ret;
}

ll _G[8][8];
ll ok[maxn][3],w[maxn];
//ok[i][j]表示i列j层往右方连的边权 
//w[i]表示第i列的边权 

struct NodeG{
    ll G[4][4];int l,r;
    //  0 * 1
    //0...2 (4...6)
    //1...3 (5...7)
    NodeG(int l=0,int r=0):l(l),r(r){
        rep(i,4)rep(j,4)
            if(i!=j)G[i][j]=INF;
            else G[i][j]=0;
    }
    inline NodeG operator + (const NodeG &rhs)const{

        NodeG ret;
        rep(i,8) rep(j,8) _G[i][j]=INF;
        rep(i,4) rep(j,4){
            _G[i][j]=G[i][j];
            _G[i+4][j+4]=rhs.G[i][j];
        }

        _G[2][4]=_G[4][2]=ok[r][1];
        _G[3][5]=_G[5][3]=ok[r][2];

        rep(k,8) rep(i,8) rep(j,8)
            _G[i][j]= min(_G[i][j],_G[i][k] + _G[k][j]);

        ret.G[2][0]=ret.G[0][2]=_G[0][6];
        ret.G[3][0]=ret.G[0][3]=_G[0][7];
        ret.G[2][1]=ret.G[1][2]=_G[1][6];
        ret.G[3][1]=ret.G[1][3]=_G[1][7];

        ret.G[1][0]=ret.G[0][1]=_G[0][1];
        ret.G[3][2]=ret.G[2][3]=_G[6][7];
        ret.l=l;ret.r=rhs.r;
        return ret;
    }
};

#define mid ((l+r)>>1)
struct Node{
    NodeG g;//存放联通情况
    Node *lc,*rc;
    Node(int l,int r){lc=rc=NULL;g=NodeG(l,r);}
    inline void up(){g=lc->g+rc->g;}
}*root;

void build(Node* &p,int l,int r){
    p=new Node(l,r); 
    if(l==r) 
    {
        //这几项是单列固定信息
        p->g.G[0][1]=p->g.G[1][0]=w[l];
        p->g.G[2][3]=p->g.G[3][2]=w[l];
        p->g.G[0][2]=p->g.G[2][0]=0;
        p->g.G[0][3]=p->g.G[3][0]=w[l];
        p->g.G[1][2]=p->g.G[2][1]=w[l];
        p->g.G[1][3]=p->g.G[3][1]=0;

        return ;
    }
    build(p->lc,l,mid);
    build(p->rc,mid+1,r);
    p->up();
}

//竖列更新信息 
void updata1(Node *p,int l,int r,int pos)
{
    if(l==r){
        p->g.G[0][1]=p->g.G[1][0]=w[pos];
        p->g.G[2][3]=p->g.G[3][2]=w[pos];
        p->g.G[0][2]=p->g.G[2][0]=0;
        p->g.G[0][3]=p->g.G[3][0]=w[pos];
        p->g.G[1][2]=p->g.G[2][1]=w[pos];
        p->g.G[1][3]=p->g.G[3][1]=0;
        return ;
    }
    if(pos<=mid) updata1(p->lc,l,mid,pos);
    else updata1(p->rc,mid+1,r,pos);p->up();
}

void updata2(Node *p,int l,int r,int pos)
{
    if(mid==pos) {p->up();return ;}
    if(mid > pos) updata2(p->lc,l,mid,pos);
    else updata2(p->rc,mid+1,r,pos);
    p->up();
}

NodeG query(Node *p,int l,int r,int L,int R)
{
    if(L<=l&&r<=R) return p->g;
    if(R<=mid) return query(p->lc,l,mid,L,R);
    else if(mid<L) return query(p->rc,mid+1,r,L,R);
    else return query(p->lc,l,mid,L,R)+query(p->rc,mid+1,r,L,R);
}

int n;

int main()
{
    cin>>n;
    for(int i=1;i<n;++i) ok[i][1]=read();
    for(int i=1;i<=n;++i) w[i]=read();
    for(int i=1;i<n;++i) ok[i][2]=read();

    build(root,1,n);

    int op,a,b,c;
    int m;cin>>m;
    while(m--)
    {
        op=read();
        if(!op)
        {
            a=read();b=read();c=read();
            if(a==1){
                w[b]=c;updata1(root,1,n,b);
            }
            else {
                ok[b][a?2:1]=c;
                updata2(root,1,n,b);
            }
        }
        else{
            a=read();b=read();
            int r1=((a&1)^1)+1,c1=(a-1)/2+1,r2=((b&1)^1)+1,c2=(b-1)/2+1;

            if(r1==r2&&c1==c2) {printf("0\n");continue;}
            if(c1>c2) swap(c1,c2),swap(r1,r2);

            NodeG t1=query(root,1,n,c1,c2);
            NodeG t2=query(root,1,n,1,c1);
            NodeG t3=query(root,1,n,c2,n);

            ll ans=t1.G[r1-1][1+r2];
            if(r1==r2){
                ans=min(ans,t2.G[2][3]+t1.G[2-r1][4-r1]+t3.G[1][0]);    
                ans=min(ans,t1.G[r1-1][4-r2]+t3.G[0][1]);
                ans=min(ans,t1.G[r2+1][2-r1]+t2.G[2][3]);
            }
            else {
                ans=min(ans,t3.G[0][1]+t1.G[2-r1][4-r2]+t2.G[2][3]);
                ans=min(ans,t2.G[2][3]+t1.G[2-r1][r2+1]);
                ans=min(ans,t3.G[0][1]+t1.G[r1-1][4-r2]);
            }
            printf("%lld\n",ans);
        }
    }
    return 0;
}

2459 datamaker

//QWsin
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int MOD=10000;//边权范围
int main()
{
    int n=100000;//长度
    srand(time(0));
    printf("%d\n",n);
    for(int i=1;i<n;++i) printf("%d ",rand()%MOD+1);
    putchar('\n');
    for(int i=1;i<=n;++i) printf("%d ",rand()%MOD+1);
    putchar('\n');
    for(int i=1;i<n;++i) printf("%d ",rand()%MOD+1);
    putchar('\n');puts("");

    int m=100000;//操作数
    printf("%d\n",m);
    while(m--)
    {
        int op=rand()%2;
        if(!op)
        {
            printf("1 %d %d\n",rand()%(2*n)+1,rand()%(2*n)+1);
        }
        else 
        {
            int k=rand()%3;
            printf("0 %d ",k);
            if(k==0||k==2) printf("%d ",rand()%(n-1)+1);
            else printf("%d ",rand()%n+1);
            printf("%d\n",rand()%MOD+1);
        }
    }
    return 0;
}
Intel MKL库常用模块的C语言实现 文章目录1. 随机数生成1.1 等概率的01分布 viRngUniform1.2 (复)高斯分布 vsRngGaussian2. 向量-向量运算2.1 向量数乘与加法 cblas_caxpby2.2 向量内积 cblas_cdotu_sub2.3 向量范数 cblas_scnrm23. 矩阵-向量运算3.1 矩阵存储方案3.2 矩阵-向量乘法 cblas_cgemv4. 矩阵-矩阵运算4.1 矩阵... 阅读详情

相关推荐

从‘最长白列’到‘八邻域’:智能车图像巡线算法怎么选?我的踩坑经验分享

本文深入探讨了全国大学生智能汽车竞赛中图像巡线算法的选型与优化,对比了最长白列法、八邻域算法等五种主流方法的性能与适用场景。通过实战数据和代码示例,分析了各算法在直道、弯道及特殊赛道元素中的表现,并提供了内存优化、参数调整等实用技巧,帮助参赛团队提升智能车的巡线精度与效率。

weixin_30374009的博客 640

[BZOJ]1018 堵塞的交通

Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个 城市和3C-2条道路。 小人国的交通状况非常槽糕。有的时候由于交通堵塞,两座城市之间的道路会变得不连通, 直到拥堵解决,道路才会恢复畅通。初来咋到的你决心毛

sSay 735

自相关互相关卷积的_相关性(Correlation)和相干性(Coherence)

1. 概念相关性(Correlation,或称相关系数或关联系数),显示两相关变量之间线性关系的强度和方向。在统计学中,相关的意义是用来衡量两个变量相对于其相互独立的距离。相干性(Coherence),与相关性计算得到的信息非常相似,都是衡量两个变量之间的相关程度,只是相干性多用于频域计算,可以在基于频率上给出更多的信息,而相关性多用于普通的数组计算和时域信号。这里其实应该有三个概念,c...

weixin_39963053的博客 3332

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

http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 用b数组表示 节点第0/1行的最右一列是否连接了右边 来 辅助 节点的合并 查询 对两个点位于矩形的位置分4种情况讨论 两点是否联通,要考虑四种情况 (以两个位置是矩形左...

weixin_34099526的博客 143

DCDC系列(一): COT DCDC基本原理

电流环DCDC属于双环控制模式,根据电流检测的位置,分为峰值电流环控制模式、谷值电流环控制模式和平均电流环控制模式,主要由输出电压反馈环和电流环两个环路来实现控制,其瞬态响应比电压环更好,且有自动限流的功能,但仍需要斜坡补偿网络,且对噪声敏感。Stage3: 在下管NMOS打开阶段,由于后级负载此时间段内消耗的电量较少,所以VFB还未低至Vref,所以此阶段中,上管PMOS和下管NMOS均处于关断状态,此时的电感电流为0mA,此阶段测的VSW上的电压就是Cout上的电压VREG;

weixin_40073649的博客 3946

vivado:差分信号和单端信号 的相互转换 IBUFDS OBUFDS

FPGA能处理的都是单端信号,但有些输入信号是差分的,这时候就需要把差分信号转为单端信号。

qq_52137732的博客 1万+

bzoj1018 [SHOI2008]堵塞的交通traffic

题目链接 分析: 这道题的题解很长,所以就不粘题面了,我们一点一点讲明白这道题 很荣幸,我看了题面之后 想到了这道题 可以很高兴的发现10w是线段树能够承受的范围 我们可以利用线段树维护连通性,每个节点内我们要维护6个信息,分别表示连通性: 读入完成后,我们面临的第一个问题就是道路的状态改变 这就牵扯到了一个change函数 在l...

weixin_30408165的博客 154

AI 赋能 DBA:如何用 DeepSeek 等大模型简化数据库管理工作

数据库管理员(DBA)的工作涉及 SQL 优化、故障排查、性能监控等复杂任务。而 DeepSeek、ChatGPT 等大模型可以大幅减少重复劳动,提高 DBA 的工作效率。:某电商平台的订单查询 SQL 执行缓慢(平均 5s),DBA 需要优化。:DBA 需要监控 MySQL 的慢查询,但不想手动写脚本。:某金融系统频繁出现数据库死锁,DBA 需要快速定位原因。:大模型可分析 SQL 执行计划,推荐索引优化方案。:用日常语言查询数据库,无需写复杂 SQL。:一键生成监控、备份、数据迁移脚本。

专注于编程、AI、人工智能等多个领域内容研究和分析 565

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

线段树有这种姿势啊。。是我太菜了。。。一开始简直被吓呆了QAQ

cgh_Andy's Blog 688

OpenDataLab 大模型训练数据集下载记录

大模型 训练数据集

u013558123的博客 3347

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

bzoj 1018 [SHOI2008]堵塞的交通traffic

http://www.elijahqi.win/archives/3425 Description   有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个 城市和3C-2条道路。 小人国的交通状况非常槽糕。有的时候由于交通堵塞,两座城市之间...

Elijahqi 322

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

bzoj一句话题解

bzoj一句话题解 by wawawa8 1000 a+b 1001 平面图最小割->对偶图最短路 1002 就是生成树个数,通过基尔霍夫矩阵可以得出递推式 \(f_i=3f_{i-1}-f_{i-2}+2\),然后高精度算一下 1003 令 \(c[i][j]\) 表示从第 \(i\) 天到第 \(j\) 天从 \(1\) 到 \(n\) 不转换路线的最短距离,然后 \(f[i]...

aozhuan8489的博客 309

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

BZOJ 3995 SDOI2015 道路修建

线段树

Fuxey 1708

BZOJ 1018 堵塞的交通traffic(线段树)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1018 题意:一个2*n的格子,相邻格子之间有一条道路。初始时道路是不通的。 三种操作:(1)某条道路连起来;(2)某条道路断开;(3)询问某两个格子是否相连。 思路:(1)首先,线段树的节点保存[L,R]区间两端的四个格子的连通情况,共六种,另外还要保存[L,mid],[mid+1,...

weixin_33752045的博客 185

[BZOJ]1018 堵塞的交通(SHOI2008)

  一道有点神的线段树。 Description   有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路。 小人国的交通状况非常槽糕。有的时候由于交通堵塞,两座城市之间的道路会变得不连通,直到拥堵解决,道路才会...

L183287669的博客 261

【BZOJ1018】堵塞的交通(线段树)

题面Description  有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个 城市和3C-2条道路。 小人国的交通状况非常槽糕。有的时候由于交通堵塞,两座城市之间的道路会变得不连通, 直到拥堵解决,道路才会恢复畅通。初来咋到的你决心毛遂自荐

小蒟蒻yyb的博客 792

bzoj 1018 堵塞的交通traffic 线段树

题意:有一个n * 2的网格图,有3种操作:给两个相邻的点加上一条边,断开相邻的两个点连着的边,询问两个点的连通性。 思路:直接看博客就行了,https://blog.youkuaiyun.com/roll_keyboard/article/details/81185535,在纸上画一画来确定4个顶点之间的更新关系。有一个需要注意的细节是有可能通过绕远路的方式可以到达,所以需要考虑前面和后面的部分...

weixin_30546933的博客 140

bzoj1018

线段树分治+并查集 线段树本身就是分治结构,碰见这种带删除修改的题目是再合适不过的,我们对于每段修改区间在线段树上打标记,每次路过就进行修改,叶子结点表及答案,先把所有修改在线段树上标记,然后dfs就行了 但是并查集怎么恢复呢?我们只要维护一个栈,保存某次操作之前这两个点的信息,dfs本身就是利用栈来操作,那么每次回溯就用栈的信息恢复之前的样子就行了 #include&lt...

weixin_30571465的博客 108

BZOJ1018 [SHOI2008]堵塞的交通traffic

线段树分治裸题 把每条边存在的区间建到线段树上,然后深搜线段树,按秩合并并查集维护连通块,回溯的时候回滚操作 #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace s

neither_nor 1265

BZOJ 2459 [BeiJing2011]神秘好人

题意:2行n列网格图,边有边权,支持 1.修改边权 2.询问两点间最短路 Sol: 身经百战之后,已经没有什么好怕的了,3行n列我也写给你看= = 把Traffic的bool数组改成int维护长度就行了 也是注意绕路情况,合并时耿直的讨论一下 Code: #include #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #

Flere825的博客 557

BZOJ1018 [SHOI2008]堵塞的交通traffic(分块+并查集)

这份题解没有在BZOJ上AC(狂汗不止),不过我觉得分块的思想挺不错的,就尝试了一下 不过相似的代码可以AC这道题LA 4082 Traffic Jam 如图,先给点编号,然后每一块中暴力维护并查集: Open:在同一块中就维护并查集,在不同块互相连通就用一个link数组记录 Close:在同一块中就把块中元素的fa[]全部重新计算,在不同块中直接把link赋零 Ask:判断

cjk_My steps 1799

【bzoj1018】【SHOI2008】【堵塞的交通traffic】

1018: [SHOI2008]堵塞的交通trafficTime Limit: 3 Sec Memory Limit: 162 MB Submit: 2252 Solved: 711 [Submit][Status][Discuss] Description有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格

Vampire 2822

BZOJ_1018_[SHOI2008]_交通堵塞traffic_(线段树)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1018 \(2*n\)的距形,起初没有边相连,之后有三种操作: 1.加边. 2.删边. 3.询问某两个点是否联通. 分析 这题太神了... 用线段树维护连通性... 放弃解释清楚了... 1 #include <bits/...

aquz77529的博客 278

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

http://www.lydsy.com/JudgeOnline/problem.php?id=1018 题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q<=100000)个操作,操作Open和Close是将格子的四个角相邻的城市连边或删边,操作Ask是询问两个城市是否连通 #include <cstdio> #in...

253
上一篇: HDU5713 K个联通块
下一篇: BZOJ1453: [Wc]Dface双面棋盘
QWsin
博客等级 码龄11年 51粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值