树上三角形(idea+lct或splay)

【java】三角形(Object 类与异常处理) 【案例问题】平面三角形有三个属性:三条边的长度(假设称为 sideA, sideB, sideC)。为了简化问 题的处理,我们假设三边长度均为整型,且 sideA 阅读详情

Description:

给定一个n个点的以1为根的树,每个点有一个正整数点权。
有q个操作,每个操作为以下类型之一:
1. 1 u v 询问树上所有在u到v的简单路径的节点(含u,v)中,是否存在三个不同的节点,使得以这三个节点的点权为边长的三条边能够构成一个三角形。
2. 2 u v 将节点u的权值改成v。
3. 3 u v 若节点v不在以节点u为根的子树里,那么令u的父节点为v,否则令v的父节点为u,如果u=v那么忽略这一条操作。
所有操作按输入的顺序进行。
这个题面应该不会看不懂吧。。

题解:

首先你得有个idea,有了这个idea就后面的好办了。

考虑构造一个数列让它没有三角形,显然最优的是斐波拉契数列。

斐波拉契数列增长得还挺快的。

大概46项时就超过了2^31-1。

所以得出结论:
如果路径长度超过46,则一定有解。

小于等于46的话,排个序,看看有没有相邻的3个数满足三角形就行了。

如果没有3操作,我们甚至连数据结构都不用写。

有了三操作,我们发现唯一的难点在于判断y是否在x的子树里。

这个先求出括号序,再用splay即可轻松解决。

splay我竟然去暴力求子树大小,结果TLE了,傻了傻了~

当然lct维护更加轻松,具体的话先makeroot(1,)access(y)一下,如果x和y在一个splay里,则y是x子树里的点,之后的是经典的link-cut

查询的话lct也是棒棒的,代码也短。

虽然这样,为了练手,还是打了splay。

Code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define fo(i, x, y) for(int i = x; i <= y; i ++)
#define fd(i, x, y) for(int i = x; i >= y; i --)
using namespace std;

const int N = 5e5 + 5;

int n, q, a[N], f[N], x, y, tp;
int next[N], to[N], final[N], tot;
int z[N][2], td;
int fa[N], t[N][2], siz[N], S, T;

void link(int x, int y) {next[++ tot] = final[x], to[tot] = y, final[x] = tot;}
void dg(int x) {
    z[x][0] = ++ td;
    for(int i = final[x]; i; i = next[i]) dg(to[i]);
    z[x][1] = ++ td;
}
void update(int x) {if(x) siz[x] = 1 + siz[t[x][0]] + siz[t[x][1]];}
int lr(int x) {return t[fa[x]][1] == x;}
void rotate(int x) {
    int y = fa[x], k = lr(x);
    t[y][k] = t[x][!k]; if(t[x][!k]) fa[t[x][!k]] = y;
    fa[x] = fa[y]; if(fa[y]) t[fa[y]][lr(y)] = x;
    fa[y] = x; t[x][!k] = y;
    update(y); update(x);
}
void splay(int x, int y) {
    while(fa[x] != y) {
        if(fa[fa[x]] != y)
            rotate(lr(x) == lr(fa[x]) ? fa[x] : x);
        rotate(x);
    }
}
int fz(int x) {return !x ? 0 : 1 + fz(t[x][0]) + fz(t[x][1]);}
int fl(int x) {return t[x][0] ? fl(t[x][0]) : x;}
int fr(int x) {return t[x][1] ? fr(t[x][1]) : x;}

int d[N], bz[N];

int main() {
    freopen("triangle.in", "r", stdin);
    freopen("triangle.out", "w", stdout);
    scanf("%d %d", &n, &q);
    fo(i, 1, n) scanf("%d", &a[i]);
    fo(i, 2, n) scanf("%d", &f[i]), link(f[i], i);

    dg(1);
    S = td + 1; T = S + 1;
    fo(i, 1, T) siz[i] = 1;
    fa[1] = S; t[S][1] = 1;
    fo(i, 2, td) fa[i] = i - 1, t[i - 1][1] = i;
    fa[T] = td; t[td][1] = T;
    fo(i, 1, T) splay(i, 0);

    fo(tm, 1, q) {
        scanf("%d %d %d", &tp, &x, &y);
        if(tp == 1) {
            int p = x;
            fo(i, 1, 46) {
                if(!p) break;
                bz[p] = tm;
                p = f[p];
            }
            int ans = 1;
            p = y;
            fo(i, 1, 46) {
                if(!p) break;
                if(bz[p] == tm) {
                    ans = 0; break;
                }
                p = f[p];
            }

            if(ans) {printf("Y\n"); continue;}

            int lca = p;
            d[0] = 1; d[1] = a[lca];
            p = x; while(p != lca) d[++ d[0]] = a[p], p = f[p];
            p = y; while(p != lca) d[++ d[0]] = a[p], p = f[p];
            sort(d + 1, d + d[0] + 1);
            fo(i, 3, d[0])
                if(d[i - 2] > d[i] - d[i - 1]) {
                    ans = 1; break;
            }

            if(ans) printf("Y\n"); else printf("N\n");
        } else
        if(tp == 2) {
            a[x] = y;
        } else {
            if(x == y) continue;

            splay(z[x][0], 0); int xz = siz[t[z[x][0]][0]];
            splay(z[x][1], 0); int xz2 = siz[t[z[x][1]][0]];
            splay(z[y][0], 0); int yz = siz[t[z[y][0]][0]];
            if(xz < yz && yz < xz2) swap(x, y);
            f[x] = y;

            splay(z[x][0], 0); int xl = fr(t[z[x][0]][0]);
            splay(z[x][1], 0); int xr = fl(t[z[x][1]][1]);
            splay(xl, 0); splay(xr, xl);
            int h = t[xr][0]; fa[h] = t[xr][0] = 0;
            splay(z[y][1], 0); int yl = fr(t[z[y][1]][0]);
            splay(yl, 0); splay(z[y][1], yl);
            t[z[y][1]][0] = h; fa[h] = z[y][1];
        }
    }
}
idea打印倒三角形 打印倒三角形 效果图 代码实现 public class Test9 { public static void main(String[] args) { for (int i = 0; i <5 ; i++) { for (int j = 5; j>5-i ; j--) { System.out.print(" "); } for (int j = 0; j &l 阅读详情

相关推荐

超详细Matlab R2021a免费安装教程(附安装包)

Matlab是一种高级技术计算语言和交互式环境,用于算法开发、数据可视化和数值计算。它集成了数学、工程和科学计算的丰富函数库,提供了强大的数据分析和绘图工具。Matlab还支持并行计算和大规模数据处理,适用于各种领域,如信号处理、图像处理、控制系统、机器学习等。

waicsdn_haha的博客 1万+

三角形问题测试实验报告

软件质量保证与测试三角形问题实验报告,仅个人作品,不保证完全正确。

m0_59287223的博客 4529

fpga学习——zynq图像处理中的DVP流接口封装

之前文章介绍了基于zynq的图像处理架构问题。其中,作为开发者,需要重点关注图像传感器接口、处理算法、显示接口,这些模块。现在我们一同学习用于视频数据接口的DVP模块,并将其封装成AXI-stream接口便于直接和VDMA IP通信。 DVP_AXI stream IP v1.0使用说明 1.设计概述 •用于cmos传感器视频数据采集,将cmos输出的8位视频数据拼接成RGB 565模式 •AXI_stream主机接口,用于和PS端内存的数据交互 •基于vivado 18.3软件设计 2.模块分析

weixin_41895751的博客 4582

树链剖分

题目: 这是一道模板题。 给定一棵n个节点的树,初始时该树的根为1号节点,每个节点有一个给定的权值。下面依次进行m个操作,操作分为如下五种类型: 换根:将一个指定的节点设置为树的新根。 修改路径权值:给定两个节点,将这两个节点间路径上的所有节点权值(含这两个节点)增加一个给定的值。 修改子树权值:给定一个节点,将以该节点为根的子树内的所有节点权值增加一个给定的值。 询问路径:询问某条路径上节点的权...

Oxide‘s Blog 934

嵌入式系统启动流程解析:ROM Code、Bootloader与启动代码的协同工作

本文深入解析嵌入式系统从通电到运行的完整启动流程,详细阐述了ROM Code、Bootloader与启动代码三者如何像接力赛般协同工作。ROM Code作为芯片固化的初始引导程序,负责硬件自检并加载Bootloader;Bootloader作为系统总指挥,初始化关键硬件并加载操作系统内核;启动代码则为C语言运行环境铺平道路。理解这三者的分工与协作,是进行系统移植和解决启动问题的关键。

dd012的博客 553

基于Simulink和Control System Toolbox的线控转向(Steer-by-Wire)系统设计

通过上述步骤,我们成功设计并实现了基于 Simulink 和 Control System Toolbox 的线控转向(Steer-by-Wire)系统。该系统能够接收来自方向盘的角度指令,经过控制器处理后,驱动转向执行器(如电动机),实现对车辆前轮转向角度的精确控制。通过虚拟场景仿真、硬件在环测试和实车测试,验证了系统的响应速度、控制精度、车辆稳定性和实时性能,并通过参数优化进一步提升了系统的性能。

MHD0815的博客 549

树上三角形(斐波那契数列神奇应用)

树上三角形(斐波那契数列神奇应用)Description给定一个大小为 n 的有点权树,需要支持两个操作。 0:询问(u,v),能否在 u 到 v 的简单路径上取三个点,使这三个点的点权作为边 长可以构成一个三角形。 1:修改某个点的点权。 Input第一行两个整数 n,q 表示树的点数和操作数。 第二行 n 个整数表示 n 个点的初始的点权。 接下来 n-1 行,每行两个整数 a,b,表

加边删边,浮生建模 989

IIC软件协议及硬件知识汇总

IIC软件协议及硬件相关知识,真的是非常齐全了!

记得诚 1万+

Java的triangle方法_java三角形类Triangle用法代码解析

本篇文章小编给大家分享一下java三角形类Triangle用法代码解析,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。三角形类Triangle设计一个名为 Triangle 的类来扩展 GeometricObject 类。该类包括:1、三个名为 side1,side2,side3 的double 数据域表示这个三角形的三条边,它们的默认值是1.0.2...

weixin_36078245的博客 3504

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测 目录时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测基本介绍ARIMAXVARVARMAVARMAXSESHWES参考资料 基本介绍 本文介绍ARIMAX、VAR、VARMA和VARMAX基本概念及其Python程序设计。 ARIMAX 具有外源回归量的自回归整合移动平均值(ARIMAX)是 ARIMA 模型的扩展,其还包括外生变量的建模。 外生变量也称为协变量,可以被认为是并行输入序列,其在与

前程算法屋的博客 6688

Python爬虫实战【房产刚需专属】:爬取链家/贝壳完整房源数据,精准筛选刚需房源【房价+户型+地段+面积+装修】

本次爬虫的核心亮点就是刚需专属筛选,我已经把刚需买房的主流筛选逻辑封装为独立函数,你只需要修改筛选参数,就能精准匹配你的需求无需懂Python语法,直接改数字/文字即可!本次爬虫是刚需买房+Python爬虫实战的完美结合。

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

【JZOJ4090】树上三角形(triangle)(LCT or splay)

Problem 给定一个n个点的以1为根的树,每个点有一个正整数点权。 有q个操作,每个操作为以下类型之一: 1. 1 u v 询问树上所有在u到v的简单路径的节点(含u,v)中,是否存在三个不同的节点,使得以这三个节点的点权为边长的三条边能够构成一个三角形。 2. 2 u v 将节点u的权值改成v。 3. 3 u v 若节点v不在以节点u为根的子树里,那么令u的父节点为v,否则令v的父...

qq_36551189的博客 426

英伟达DeepStream学习笔记7——DeepStream接入USB相机并实现广角摄像头的畸变矫正

deepstream官方提供了一个畸变矫正的例子,包含了鱼眼和普通广角的矫正。我目前准备做一个广角的畸变矫正,我已经使用opencv实现功能,目前增加到deepstream框架中。示例代码在\opt\nvidia\deepstream\deepstream-5.0\sources\apps\sample_apps\deepstream-dewarper-test 中,鱼眼矫正——deepstream官方版 https://developer.nvidia.com/blog/calibration-trans

耶律大石的博客 1602

IDEA中打印三角形

1.实现在IDEA中打印三角形 2.源代码如下: public class printtriangle { public static void main(String[] args) { int x =5; //对x进行赋值,数字用于改变行数 for(int i=0;i<x;i++) { for(int j=0;j<i+1;j++) { System.out.print("*"); } System.out.println(""); } } } 3.效果图如下: 其中将循环

PythonLYyyds的博客 1171

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

树上三角形(triangle) 基于LCT上的暴力

LCT

YxuanwKeith的博客 941

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

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

IDEA写代码时,在代码行数上出现灰色小三角,灰色三角箭头

java、IDEA、git、gitee

zhangfuping123456789的博客 1720

IDEA的使用指南

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

在idea中设置main函数的左边显示三角形运行符号

在idea中设置main函数的左边显示三角形运行符号

It_BeeCoder的博客 2094

IntelliJ IDEA 13试用手记(附详细截图)

从去年开始转java以来,一直在寻找一款趁手的兵器,eclipse虽然是很多java程序员的首选,但是我发现一旦安装了一些插件,workspace中的项目达到数10个以后,经常崩溃,实在影响编程的心情. 今天试用了近年获得众多好评的IntelliJ IDEA 13,感觉焕然一新,记录如下:   一、下载安装 http://www.jetbrains.com/idea/download/ 这...

weixin_33717298的博客 540

idea中main函数左边没有三角形运行符号问题

没出现main函数左边的三角形原因是我打开的只是一堆文件,并不是一个项目

weixin_43226306的博客 1万+

树上三角形

Description给定一大小为n的有点权树,每次询问一对点(u,v),问是否能在u到v的简单路径上取三个点权,以这三个权值为边长构成一个三角形。同时还支持单点修改。Input第一行两个整数n、q表示树的点数和操作数 第二行n个整数表示n个点的点权 以下n-1行,每行2个整数a、b,表示a是b的父亲(以1为根的情况下) 以下q行,每行3个整数t、a、b 若t=0,则询问(a,b) 若t=

wang_sj的博客 371

编程之美热身赛 题目3 : 树上的三角形

题目3 : 树上的三角形 时间限制:4000ms 单点时限:2000ms 内存限制:256MB 描述 有一棵树,树上有只毛毛虫。它在这棵树上生活了很久,对它的构造了如指掌。所以它在树上从来都是走最短路,不会绕路。它还还特别喜欢三角形,所以当它在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三

烂笔头 688

【FJWC2016】树上三角形 / LCA

题 给定一棵 nnn 个点的树,每个点有个 [1,231−1][1,231−1][1,2^{31}-1] 的点权,有 QQQ 个操作。 操作类型 000 :修改某个点的点权。 操作类型 111 :给定 a,ba,ba,b ,判断从 a,ba,ba,b 之间的唯一路径上的所有点(路径上的点当然也包括 aaa 和 bbb 啦)中能否选出三个点,满足能以这三个点的点权为边长构成三角形。 n,Q≤...

天狼_Sirius的博客 / SiriusNEO 275

BZOJ3251 树上三角形

Address BZOJ3251 Solution 正解没想出来还把 LCA 写挂了,实在太弱了。 先考虑一种暴力,把 u→vu→vu \to v 路径上所有点权取出,按从小到大排序,则我们只需要判断相邻的三个元素是否能构成三角形即可。 一个简单的解释: 假设排序完后的序列为 a1,a2,...,ama1,a2,...,ama_1, a_2, ... , a_m,枚举三角形的最长...

Log_x's Blog 589

【bzoj3251】【树上三角形】【暴力】

Description 给定一大小为n的有点权树,每次询问一对点(u,v),问是否能在u到v的简单路径上取三个点权,以这三个权值为边长构成一个三角形。同时还支持单点修改。   Input 第一行两个整数n、q表示树的点数和操作数 第二行n个整数表示n个点的点权 以下n-1行,每行2个整数a、b,表示a是b的父亲(以1为根的情况下) 以下q行,每行3个整数t、a、b

sunshinezff的专栏 800

IDEA在编写代码时,代码语句没有左侧语句类型图标提示解决方法.

如图所示: 当idea中在编写代码的时候没有了部分图标提示,可以按照如下操作,选中你想要显示的图标,即可实现.

weixin_45493751的博客 2909
上一篇: [JLOI2015]有意义的字符串(数学+矩阵乘法)
下一篇: Dilworth定理学习小记
Cold_Chair
博客等级 码龄11年 158粉丝 410原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值