【BZOJ4736】【UOJ274】温暖会指引我们前行(LCT)

17 篇文章 0 订阅
11 篇文章 0 订阅

Description

来来来,看看BZOJ极其优美的题面 (滑稽(^o^)/~)


Solution

LCT维护最大生成树的裸题。
三种操作:
1. 加边
- 如果本来两点之间不联通,那么直接连上
- 如果联通,那么判断两点之间的最小值小于新边的边权,那么删去最小的边,加上新边,否则不进行操作。
2. 询问
没什么好说的
3. 更改距离
距离不影响我们的树,直接修改即可。

这题打得挺快的,BZOJ上也AC了,然后UOJ上莫名TLE了Extra Test 5
TM是谁搞了Extra Test这个鬼东西的
于是把之前偷懒写的__gnu_pbds::cc_hash_table改掉,然后将判是否联通改成并查集就过去了。。。


Source

/************************************************
 * Au: Hany01
 * Date: Apr 3rd, 2018
 * Prob: [BZOJ4736][UOJ274] 温暖会指引我们前行
 * Email: hany01@foxmail.com
************************************************/

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;
#define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
#define rep(i, j) for (register int i = 0, i##_end_ = (j); i < i##_end_; ++ i)
#define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i)
#define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i)
#define Set(a, b) memset(a, b, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define x first
#define y second
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) ((int)(a).size())
#define INF (0x3f3f3f3f)
#define INF1 (2139062143)
#define Mod (1000000007)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define y1 wozenmezhemecaia

template <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }

inline int read()
{
    register int _, __; register char c_;
    for (_ = 0, __ = 1, c_ = getchar(); c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1;
    for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48);
    return _ * __;
}

const int maxn = 100005, maxm = 300005;

int n, len[maxn + maxm], temp[maxn + maxm], eu[maxm], ev[maxm], fa[maxn];

int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }

struct LCT
{
    int fa[maxn + maxm], ch[maxn + maxm][2], mt[maxn + maxm], sl[maxn + maxm], rev[maxn + maxm], id[maxn + maxm];

#define dir(x) (ch[fa[x]][1] == x)
#define isrt(x) (ch[fa[x]][1] != x && ch[fa[x]][0] != x)

    inline void pushdown(int u) {
        if (rev[u]) rev[u] = 0, rev[ch[u][0]] ^= 1, rev[ch[u][1]] ^= 1, swap(ch[u][0], ch[u][1]);
    }

    inline void maintain(int u)
    {
        mt[u] = min(mt[ch[u][0]], min(mt[ch[u][1]], temp[u]));
        if (mt[u] == temp[u]) id[u] = u;
        else if (mt[u] == mt[ch[u][0]]) id[u] = id[ch[u][0]];
        else id[u] = id[ch[u][1]];
        sl[u] = sl[ch[u][0]] + sl[ch[u][1]] + len[u];
    }

    inline void rotate(int u)
    {
        int f = fa[u], gf = fa[f], d = dir(u);
        fa[ch[f][d] = ch[u][d ^ 1]] = f;
        fa[u] = gf;
        if (!isrt(f)) ch[gf][dir(f)] = u;
        ch[u][d ^ 1] = f, fa[f] = u;
        maintain(f), maintain(u);
    }

    int stk[maxn + maxm], top;
    inline void splay(int u)
    {
        stk[top = 1] = u;
        for (int t = u; !isrt(t); t = fa[t]) stk[++ top] = fa[t];
        while (top) pushdown(stk[top --]);
        for ( ; !isrt(u); rotate(u)) if (!isrt(fa[u]))
            rotate(dir(u) == dir(fa[u]) ? fa[u] : u);
    }

    inline void access(int u)
    {
        for (register int t = 0; u; t = u, u = fa[u])
            splay(u), ch[u][1] = t, maintain(u);
    }

    inline void makeroot(int u) {
        access(u), splay(u), rev[u] ^= 1;
    }

    inline void split(int u, int v) { makeroot(u), access(v), splay(v); }

    inline int findroot(int u) {
        access(u), splay(u);
        while (ch[u][0]) u = ch[u][0];
        return u;
    }

    inline void link(int u, int v) {
        //assert(findroot(u) == findroot(v));
        makeroot(u), fa[u] = v;
    }

    inline void cut(int u, int v) { split(u, v), fa[u] = ch[v][0] = 0; }

}lct;

int main()
{
#ifdef hany01
    File("bzoj4736");
#endif

    static char type[10];

    n = read();
    Set(lct.mt, 127), Set(temp, 127);
    For(i, 1, n) fa[i] = i;
    for (static int m = read(); m --; )
    {
        register int id, u, v;
        scanf("%s", type);
        if (type[0] == 'f') {
            id = read() + 1, u = read() + 1, v = read() + 1, temp[n + id] = read(), len[n + id] = read();
            if (u > v) swap(u, v);
            eu[id] = u, ev[id] = v;
            if (find(u) == find(v))
            {
                lct.split(u, v);
                if (lct.mt[v] < temp[n + id]) {
                    register int tmp = lct.id[v] - n;
                    lct.cut(eu[tmp], tmp + n), lct.cut(ev[tmp], tmp + n);
                    lct.link(u, n + id), lct.link(v, n + id);
                }
            } else lct.link(u, n + id), lct.link(n + id, v), fa[find(u)] = find(v);
        }
        else if (type[0] == 'm') {
            u = read() + 1, v = read() + 1;
            if (find(u) != find(v)) puts("-1");
            else {
                lct.split(u, v);
                if (lct.findroot(v) != u) puts("-1");
                else printf("%d\n", lct.sl[v]);
            }
        } else
            id = read() + 1 + n, lct.splay(id), len[id] = read(), lct.maintain(id);
    }

    return 0;
}
//戚姬髡发入舂市,万古共悲辛。
//    -- 李白《中山孺子妾歌》
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值