bzoj1969LANE 航线规划

LeGO-LOAM运行kitti数据集 文章目录1. kitti-lego-loam2. 改动3. 实验结果4. evo轨迹测评 1. kitti-lego-loam 链接:kitti-lego-loam kitti-lego-loam提供了将kitti序列转化成rosbag的代码,在kittibag中. 需要注意下数据文件的存放顺序,以00序列为例: datafolder          |____results          & 阅读详情

对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系。 星际空间站的Samuel II巨型计算机经过长期探测,已经锁定了Samuel星系中许多星球的空间坐标,并对这些星球从1开始编号1、2、3……。 一些先遣飞船已经出发,在星球之间开辟探险航线。 探险航线是双向的,例如从1号星球到3号星球开辟探险航线,那么从3号星球到1号星球也可以使用这条航线。 例如下图所示: 在5个星球之间,有5条探险航线。 A、B两星球之间,如果某条航线不存在,就无法从A星球抵达B星球,我们则称这条航线为关键航线。 显然上图中,1号与5号星球之间的关键航线有1条:即为4-5航线。 然而,在宇宙中一些未知的磁暴和行星的冲撞,使得已有的某些航线被破坏,随着越来越多的航线被破坏,探险飞船又不能及时回复这些航线,可见两个星球之间的关键航线会越来越多。 假设在上图中,航线4-2(从4号星球到2号星球)被破坏。此时,1号与5号星球之间的关键航线就有3条:1-3,3-4,4-5。 小联的任务是,不断关注航线被破坏的情况,并随时给出两个星球之间的关键航线数目。现在请你帮助完成。
Input
第一行有两个整数N,M。表示有N个星球(1< N < 30000),初始时已经有M条航线(1 < M < 100000)。随后有M行,每行有两个不相同的整数A、B表示在星球A与B之间存在一条航线。接下来每行有三个整数C、A、B。C为1表示询问当前星球A和星球B之间有多少条关键航线;C为0表示在星球A和星球B之间的航线被破坏,当后面再遇到C为1的情况时,表示询问航线被破坏后,关键路径的情况,且航线破坏后不可恢复; C为-1表示输入文件结束,这时该行没有A,B的值。被破坏的航线数目与询问的次数总和不超过40000。
Output
对每个C为1的询问,输出一行一个整数表示关键航线数目。 注意:我们保证无论航线如何被破坏,任意时刻任意两个星球都能够相互到达。在整个数据中,任意两个星球之间最多只可能存在一条直接的航线。
Sample Input
5 5
1 2
1 3
3 4
4 5
4 2
1 1 5
0 4 2
1 5 1
-1

Sample Output
1
3

题意:给你一张无向图,两种操作一种是把路径u,v破坏掉第二种问你路径u,v上有多少条割边
思路:首先缩点很容易想到,缩点后成为一棵树,很容易知道缩点所包含的所有边不可能为割边,因为缩点是将成环的点缩成一个点。然后还可以知道缩点后树上每条边都是割边,即我们要求的查询数量。这样我们的查询就转变成了,在缩点后u所属的集合到v所属集合的路径上有多少条边。树上操作很容易想到dis(u) + dis(v) - 2*dis(lca(u,v))那么现在比较尴尬的就是破坏u,v这种想法了。想法1:破坏u,v之间的路径会把u,v之间的边全部破坏,如果破坏的边是环上的边那么对答案无影响。如果破坏的是割边那么割边数量-1。等效操作就是连接一条u到v的边,使其成环。那么我们就需要从被破坏的树的最终形态开始加边加到刚缩点的状态。然后每次加边会让u的子树向上提升,v的子树也向上提升,我们只要暴力合并就可以了。想法2:我们定义未被破坏的边为白边,破坏了为黑边,那么每次破坏就是把一条路径描黑,自然想到树链剖分。

这里由于沈阳网络赛的MUSTEDGE卡了树链剖分。。。这里 用了暴力合并维护子树的方法2333

这题。。。如果用树链剖分的话大概就是很多个板子一起打吧2333
虽然有debug代码=-=但是我写的感觉比别人长好多

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
using namespace std;


//thanks to pyf ...
//thanks to qhl ...

const int N = 3e5 + 7;

vector<int>G[N];
vector<pair<int, int> > edges;
vector<int> g[N];
bool is_cut[N];
map<pair<int, int>, bool > is_del;
int dfn[N], low[N], fa[N], L[N], R[N];
int f[N][21], dep[N];
int Index = 0, id = 0;
void init()
{
    is_del.clear();
    for (int i = 0; i < N; i++)
        G[i].clear(), g[i].clear(), fa[i] = i;
    edges.clear();
    memset(dfn, 0, sizeof(dfn));
    memset(is_cut, 0, sizeof(is_cut));
    memset(low, 0, sizeof(low));
    Index = id = 0;
}
void add_edge(int u, int v)
{
    edges.push_back(make_pair(u, v));
    G[u].push_back(edges.size() - 1);
    edges.push_back(make_pair(v, u));
    G[v].push_back(edges.size() - 1);
}
void tarjan(int u, int Fa)
{
    dfn[u] = low[u] = ++ Index;
    for (int i = 0; i < G[u].size(); i++)
    {
        int v = edges[G[u][i]].second;
        if (v == Fa || is_del.count(make_pair(u, v)))
            continue;
        if (!dfn[v])
        {
            tarjan(v, u);
            low[u] = min(low[u], low[v]);
            if (low[v] > dfn[u])
                is_cut[G[u][i] ^ 1] = is_cut[G[u][i]] = 1;
        }
        else low[u] = min(low[u], dfn[v]);
    }
}
int find(int x)
{
    if (fa[x] != x)
        fa[x] = find(fa[x]);
    return fa[x];
}
void merge(int u, int v)
{
    u = find(u), v = find(v);
    if (u == v)
        return;
    if (dep[u] > dep[v])
        swap(u, v);
    fa[v] = u;
}
void Create_Tree(int n)
{
    for (int i = 1; i <= n; i++)
    {
        sort(G[i].begin(), G[i].end());
        G[i].erase(unique(G[i].begin(), G[i].end()), G[i].end());
    }
    for (int i = 1; i <= n; i++)
        if (!dfn[i])
            tarjan(i, i);
    for (int i = 0; i != edges.size(); i ++)
        if (!is_cut[i] && !is_del.count(make_pair(edges[i].first, edges[i].second)))
            merge(edges[i].first, edges[i].second);
    for (int i = 0; i != edges.size(); i++)
        if (is_cut[i] && !is_del.count(make_pair(edges[i].first, edges[i].second)))
            g[find(edges[i].first)].push_back(find(edges[i].second));
    for (int i = 1; i <= n; i++)
    {
        sort(g[i].begin(), g[i].end());
        vector<int> :: iterator it = unique(g[i].begin(), g[i].end());
        g[i].erase(it, g[i].end());
    }
    // for (int i = 1; i <= n; i++)
    // {
    //  cout << "*" << i;
    //  for (int j = 0; j < g[i].size(); j++)
    //      cout << "---->" << g[i][j];
    //  cout << endl;
    // }
}
void dfs(int u, int fa, int d)
{
    L[u] = ++ id;
    dep[u] = d, f[u][0] = fa;
    for (int i = 1; i <= 20; i++)
        f[u][i] = f[f[u][i - 1]][i - 1];
    for (int i = 0; i != g[u].size(); i ++)
    {
        int v = g[u][i];
        if (v == fa)
            continue;
        dfs(v, u, d + 1);
    }
    R[u] = id;
}
int lca(int u, int v)
{
    if (dep[u] < dep[v])
        swap(u, v);
    for (int i = 20; i >= 0; i--)
        if (dep[f[u][i]] >= dep[v])
            u = f[u][i];
    if (u == v)
        return u;
    for (int i = 20; i >= 0; i--)
        if (f[u][i] != f[v][i])
            u = f[u][i], v = f[v][i];
    return f[u][0];
}
struct Tree
{
    int l, r;
    int sum, vis;
} t[N * 4];
void push_down(int step)
{
    if (!t[step].vis)
        return;
    t[step * 2].vis += t[step].vis;
    t[step * 2 + 1].vis += t[step].vis;
    t[step * 2].sum += (t[step * 2].r - t[step * 2].l + 1) * t[step].vis;
    t[step * 2 + 1].sum += (t[step * 2 + 1].r - t[step * 2 + 1].l + 1) * t[step].vis;
    t[step].vis = 0;
}
void build(int l, int r, int step)
{
    t[step].l = l, t[step].r = r, t[step].vis = 0, t[step].sum = 0;
    if (l == r)
        return;
    int mid = (l + r) / 2;
    build(l, mid, step * 2);
    build(mid + 1, r, step * 2 + 1);
}
void update(int l, int r, int val, int step)
{
    if (t[step].l == l && r == t[step].r)
    {
        t[step].vis += val;
        t[step].sum += val * (t[step].r - t[step].l + 1);
        return;
    }
    int mid = (t[step].l + t[step].r) / 2;
    push_down(step);
    if (r <= mid)
        update(l, r, val, step * 2);
    else if (l > mid)
        update(l, r, val, step * 2 + 1);
    else update(l, mid, val, step * 2), update(mid + 1, r, val, step * 2 + 1);
}
int query(int x, int step)
{
    if (t[step].l == t[step].r)
        return t[step].sum;
    int mid = (t[step].l + t[step].r) / 2;
    push_down(step);
    if (x <= mid)
        return query(x, step * 2);
    else if (x > mid)
        return query(x, step * 2 + 1);
}
void del(int u, int v)
{
    u = find(u), v = find(v);
    int anc = find(lca(u, v));
    while (find(u) != find(anc))
    {
        update(L[find(u)], R[find(u)], -1, 1);
        merge(find(u), f[find(u)][0]);
    }
    while (find(v) != find(anc))
    {
        update(L[find(v)], R[find(v)], -1, 1);
        merge(find(v), f[find(v)][0]);
    }
}
int Get_Ans(int u, int v)
{
    u = find(u), v = find(v);
    int anc = find(lca(u, v));
    return query(L[u], 1) + query(L[v], 1) - 2 * query(L[anc], 1);
}
vector<pair<bool, pair<int, int> > > Q;
vector<int> ac;
int main()
{
    int n, m;
    while (scanf("%d%d", &n, &m) == 2)
    {
        init();
        ac.clear();
        for (int i = 0; i < m; i++)
        {
            int u, v;
            scanf("%d%d", &u, &v);
            add_edge(u, v);
        }
        Q.clear();
        int op, x, y;
        while (~scanf("%d", &op))
        {
            if (op == -1)
                break;
            scanf("%d%d", &x, &y);
            Q.push_back(make_pair(op, make_pair(x, y)));
            if (!op)
            {
                is_del[make_pair(x, y)] = 1;
                is_del[make_pair(y, x)] = 1;
            }
        }
        Create_Tree(n);
        dfs(find(1), find(1), 0);
        build(1, n, 1);
        for (int i = 1; i <= n; i++)
            if (find(i) == i)
                update(L[i], L[i], dep[i], 1);
        for (int i = Q.size() - 1; i >= 0; i --)
        {
            op = Q[i].first;
            x = find(Q[i].second.first);
            y = find(Q[i].second.second);
            if (!op)
                del(x, y);
            else
                ac.push_back(Get_Ans(x, y));
        }
        reverse(ac.begin(), ac.end());
        for (int i = 0; i != ac.size(); i++)
            printf("%d\n", ac[i]);
    }
}
用AG9311芯片DIY一个多功能Type-C扩展坞:从原理图到PCB布局的保姆级指南 本文详细介绍了如何利用AG9311芯片DIY多功能Type-C扩展坞,涵盖从原理图设计到PCB布局的全过程。AG9311芯片作为高性价比的Type-C控制器,支持HDMI 2.0、USB 3.0、PD快充和千兆网口,适合硬件爱好者打造个性化扩展坞。文章还提供了调试技巧和进阶优化建议,帮助读者轻松完成项目。 阅读详情

相关推荐

Unity开发微信小游戏,使用Addressables管理游戏资源(本地进行远程测试)

快速构建Unity微信小游戏 使用Addressables管理游戏资源 使用小皮助手在本地进行远程资源加载测试

the_vnas的博客 6390

【BZOJ 1969】【AHOI 2005】LANE 航线规划【离线、hash、并查集、树链剖分、线段树】

Description星际空间站的Samuel II巨型计算机经过长期探测,已经锁定了Samuel星系中许多星球的空间坐标,并对这些星球从1开始编号1、2、3……。 一些先遣飞船已经出发,在星球之间开辟探险航线。 探险航线是双向的,例如从1号星球到3号星球开辟探险航线,那么从3号星球到1号星球也可以使用这条航线。 例如下图所示: 在5个星球之间,有5条探险航线。 A、B两星球之间,如果某条航线不存

cyclization的小栈 444

苍穹外卖项目面试总结话术

美食速递这个项目最初是我参与制作的大创项目,是一款为中南学生提供校园外卖送至宿舍服务的软件,包含系统管理后台和小程序端两部分。其中系统管理后台主要提供给食堂内部员工使用,可以对食堂各个窗口、员工、订单、菜品等进行维护管理;小程序端可以在线浏览菜品、添加购物车、下单等,由学生兼职做跑腿送餐上门服务。这是个前后端分离的项目,我主要是负责后端的用户登录、员工管理,菜品管理,订单管理模块的编码实现。

qq_45195447的博客 1万+

【BZOJ1969】航线规划(AHOI2005)-边双连通分量+树链剖分

测试地址:航线规划 做法:本题需要用到边双连通分量+树链剖分。 注意到,这题有删边操作,又要维护边双连通分量相关信息(从割边自然想到维护边双连通分量),无法维护。注意到没有强制在线,所以我们可以倒过来,变成有加边操作,同时维护边双连通分量,这样就好做了。 首先将边双连通分量缩点,缩完后图变为一棵树,而每加一条边,实际上就是把两个端点在树中的路径合并为一个点。虽然维护合并貌似可以用并查集暴力维...

Maxwei_wzj的OI世界 403

多智能体强化学习MASAC算法:从原理到PyTorch实战详解

深度强化学习通过智能体与环境的交互试错来学习最优策略,是解决复杂序列决策问题的核心技术。其核心原理在于利用价值函数或策略梯度来最大化累积奖励,在机器人控制、游戏AI等领域展现出巨大技术价值。当面对多个智能体需要协同或竞争的复杂动态环境时,单智能体算法因环境非平稳性而面临挑战,多智能体强化学习应运而生。Multi-Agent Soft Actor-Critic (MASAC) 算法融合了SAC的稳定高效与中心化训练去中心化执行的范式,通过维护中心化Critic网络和独立策略网络,有效解决了多智能体协作中的信用

weixin_30080745的博客 326

[STM32]HAL STM32F103 软件I2C读写MPU6050(附DMP库移植)

本文介绍了如何在STM32F103C8T6上通过I2C协议与MPU6050传感器通信并实现DMP功能。首先,使用STM32CubeMX配置项目,设置时钟和I2C接口。然后,编写软件I2C协议的读写函数与MPU6050交互。接着,移植DMP库并进行必要修改,获取加速度计和陀螺仪数据,并将其转换为欧拉角显示在OLED上。最后,利用Keil的逻辑分析仪监测I2C时序。

m0_56841583的博客 2321

【BZOJ1969】航线规划(Link-Cut Tree)

题面BZOJ题解删边操作 套路呀 离线读入倒过来做 变成加边操作现在考虑怎么确定两点直接的关键路径条数 如果是一棵树,那么每条边都是关键路径 在一棵树的基础上 如果连接了两点 那么,两点之间原来的路径一定都不是关键路径 所以,弄一个LCTLCT 每次维护加边#include<iostream> #include<cstdio> #include<cstdlib> #include<

小蒟蒻yyb的博客 507

从零到千兆:KSZ9031 PHY芯片在Zynq PS端的驱动移植心路历程

本文详细记录了在Xilinx Zynq-7000平台(基于XC7Z020芯片)上,为KSZ9031千兆以太网PHY芯片移植LwIP协议栈驱动的完整过程。从硬件连接配置、Vivado工程设置到LwIP库的深度修改与调试,分享了解决PHY识别、自协商及性能优化等关键问题的实战经验,助力开发者实现稳定的千兆网络连接。

honey的博客 1104

BZOJ 1969: [Ahoi2005]LANE 航线规划( 树链剖分 )

首先我们要时光倒流, 倒着做, 变成加边操作维护关键边. 先随意搞出一颗树, 树上每条边都是关键边(因为是树, 去掉就不连通了)....然后加边(u, v)时, 路径(u, v)上的所有边都变成非关键边了, 因为形成了环, 环上任意2点有2条路径。。。下图, 加上蓝色的边, 红色x的边就变成了非关键边.所以树链剖分维护一下...时间复杂度O(NlogN+MlogM+Qlog^2N), 可以AC...

weixin_30375247的博客 207

Unreal Engine鸿蒙移植实战:环境配置、构建流程与性能优化指南

游戏引擎移植是跨平台开发中的关键技术环节,其核心原理在于通过适配目标操作系统的底层接口和工具链,实现同一套代码在不同硬件和软件环境下的高效运行。这项技术的价值在于最大化代码复用率,降低多平台维护成本,并能让应用快速触达新兴生态系统的用户。在移动游戏和XR应用领域,随着鸿蒙HarmonyOS生态的快速发展,将成熟的商业引擎如Unreal Engine迁移至此平台,成为开发者探索新市场机会的重要路径。本文聚焦于Unreal Engine项目向鸿蒙系统的移植实践,详细解析了从环境搭建、源码适配到构建打包的全链路流

weixin_29011395的博客 403

Ubuntu-22.04安装VMware虚拟机并安装Windows10

最近在研究虚拟机,主要集中在KVM、Virtualbox和VMware这三种虚拟机上。前面我已经研究了前两种虚拟机的安装和使用方式,这篇文章介绍3兄弟中最后一个虚拟机安装和使用方式。Virtualbox虚拟机安装和使用KVM虚拟机安装和使用相比于前两种,VMware的安装方式最麻烦,但是综合体验下来我感觉流畅度最好。如果你确实有在Linux上使用VMware虚拟机的需求,那不妨跟着我看下去吧。1、gcc版本和内核版本一定要匹配上,否则会出各种错误。

jiexijihe945的博客 4114

[BZOJ]1969: [Ahoi2005]LANE 航线规划 离线树链剖分

离线树链剖分

TYB的博客 510

告别调参难!YOLO超参数优化指南(网格搜索+贝叶斯优化实战)

YOLO超参数优化的本质,不是“试遍所有参数”,而是“用工具化方法,在场景约束内找到最优平衡”——网格搜索稳、贝叶斯优化快,两者结合(先粗搜再精调)是工业场景的最优解。先定范围:基于工业场景(小目标/边缘设备/多类别)缩小参数搜索范围,避免无效探索。先调核心:优先优化数据增强、学习率、输入尺寸,这些参数对精度影响最大。工具赋能:用网格搜索+贝叶斯优化替代人工试错,再用TensorBoard监控,让调参“有据可依”。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 698

BZOJ1969: [Ahoi2005]LANE 航线规划

BZOJ1969: [Ahoi2005]LANE 航线规划 Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系。 星际空间站的Samuel II巨型计算机经过长期探测,已经锁定了Samuel星系中许多星球的空间坐标,并对这些星球从1开始编号1、2、3……。 一些先遣飞船...

weixin_30875157的博客 175

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【AHOI2005】【BZOJ1969】LANE 航线规划

Description对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系。 星际空间站的Samuel II巨型计算机经过长期探测,已经锁定了Samuel星系中许多星球的空间坐标,并对这些星球从1开始编号1、2、3……。 一些先遣飞船已经出发,在星球之间开辟探险航线。 探险航线是双向的,例如从1号星球到3

CreationAugust is 14 years old forever 1096

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[BZOJ1969] [AHOI2005]LANE 航线规划

Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系。 星际空间站的Samuel II巨型计算机经过长期探测,已经锁定了Samuel星系中许多星球的空间坐标,并对这些星球从1开始编号1、2、3……。 一些先遣飞船已经出发,在星球之间开辟探险航线。 探险航线是双向的,例如从1号星球...

weixin_30887919的博客 139

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

bzoj 1969: [Ahoi2005]LANE 航线规划

好久不写图论题好虚啊,m打成n RE了3次QAQ人生耻辱啊。 首先假设没有删边,显然答案是两点间桥的数量。 于是求边双连通分量,缩点缩边,只留下桥。 所以剩下的肯定是树啦。 于是询问变成了求树上两点间距离,求下LCA就可以直接做了。 但是还有删边操作。 删边肯定不好处理。 反过来改成加边操作。 两点与LCA形成了一个边双联通分量,于是把他们缩起来。 直接缩不可取,考虑缩点的后果是

月下沙茶树 1076

【BZOJ1969】[Ahoi2005]LANE 航线规划 离线+树链剖分+线段树

【BZOJ1969】[Ahoi2005]LANE 航线规划 Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系。 星际空间站的Samuel II巨型计算机经过长期探测,已经锁定了Samuel星系中许多星球的空间坐标,并对这些星球从1开始编号1、2、3……。 一些先...

aodanchui1057的博客 118

BZOJ 线段树 1969: [Ahoi2005]LANE 航线规划

1969: [Ahoi2005]LANE 航线规划 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 132  Solved: 55 [Submit][Status] Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系

We Can 2230

[BZOJ1969][AHOI2005]LANE 航线规划

题面戳我 sol 这种连通图转树的操作也算是比较常见了吧。 先把所有询问离线,反过来做,就变成了加入一条边,然后判断一条边是不是关键的。考虑到图始终联通所以可以用最终还剩下的边建出一棵生成树,初始每条边的权值都是1,然后不在这棵生成树上的边,就在这棵生成树上做一个路径覆盖,被覆盖到的边的权值改成0。 所以就可以用树剖或者是LCT做啦。 code LCT(不想写树剖hh) #include...

abcyan1235的博客 104

[bzoj1969][AHOI2005]LANE 航线规划

题目大意一个n个节点m条边的图,两点间的关键边定义为从一点走到另一个点必须经过的边。 现有许多操作,删一条边或者询问两点间的关键边数量。 保证任意时刻原图联通。时间倒流先把所有边删掉,然后倒着做,转删边为加边。 然后我们思考,最后原图也是联通的,那么做边双联通分量缩点后,就会变成一棵树。 然后显然两个结点间关键边数等于它们所处联通分量代表的点在树上树路径的边数。 然而我们要处理加边,每加一

不来也不去的一只失忆蝴蝶 1185

BZOJ[1969] [Ahoi2005]LANE 航线规划

这个题很清真 就是可以考虑将删除的边倒叙插入,因为题面中说了,保证删了所有边之后,保证图的连通性 ,所以先在删完点的图上缩点,然后剩下的边就是关键边,之后再把删除的边插入,这样就会使得之前的一些点之间的关键边的不关键,之后用线段树维护就行了 1 #include <set> 2 #include <cmath> 3 #include &...

aqmoai6644的博客 157

[BZOJ1969][Ahoi2005]LANE 航线规划

Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系。 星际空间站的Samuel II巨型计算机经过长期探测,已经锁定了Samuel星系中许多星球的空间坐标,并对这些星球从1开始编号1、2、3……。 一些先遣飞船已经出发,在星球之间开辟探险航线。 探险航线是双向的,例如从1号星...

weixin_30319153的博客 163

Bzoj1969: [Ahoi2005]LANE 航线规划

题面 戳我 Sol 把询问反过来,变成加边,先加上边变成一棵树,之后每次加边就相当于去掉这两个点与这条边形成的环的代价,用树剖+线段树覆盖区间即可 # include # define RG register # define IL inline # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; ty

Cyhlnj 379

●BZOJ 1969 [Ahoi2005]LANE 航线规划

题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1969 题解: 线段树,树链剖分,反向考虑思路是很巧妙,但是感觉代码真的恶心。。 反着考虑,先按照给出的操作把所有该删的边都删掉,那么剩下的也还是一个联通块。(题目保证了的)然后在该联通块里随便选出某些边来形成一颗树。那么显然,若只看树边的话,每一条树边都是一条关键边,如果此时加一条...

weixin_30716141的博客 153

bzoj1969: [Ahoi2005]LANE 航线规划

不难的树链剖分

OZY的博客 350
上一篇: Codeforces854D Jury Meeting
下一篇: hdu6200mustedge mustedge mustedge
OneDay_pyf
博客等级 码龄10年 6粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值