BZOJ3251: 树上三角形

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
若t=0,则询问(a,b)
若t=1,则将点a的点权修改为b
n,q<=100000,点权范围[1,2^31-1]

Output

对每个询问输出一行表示答案,“Y”表示有解,“N”表示无解。

Sample Input

5 5
1 2 3 4 5
1 2
2 3
3 4
1 5
0 1 3
0 4 5
1 1 4
0 2 5
0 2 3

Sample Output

N
Y
Y
N
题解Here!
首先容易想到一个暴力算法:
若询问是x,y,求出LCA(x,y),暴力将这条链中所有的点权存入数组,排个序,暴力扫一遍。
也就是这样:
bool solve(int x,int y){int lca=LCA(x,y);int top=0,num[100010];num[++top]=val[lca];for(int i=x;i!=lca;i=fa[i])num[++top]=val[i];for(int i=y;i!=lca;i=fa[i])num[++top]=val[i];sort(num+1,num+top+1);if(top<3)return false;for(int i=3;i<=top;i++)if(num[i]<num[i-1]+num[i-2])return true;return false;
}

但是不用想就知道肯定TLE。。。

怎么办?

我们注意到点权是231以内的数,而判断条件是两边之和大于第三边

两边之和大于第三边!

跟某一个式子很像:f[i]=f[i-1]+f[i-2]

这是什么?斐波那契数列!

在231以内,数列的最大项只达到了50项。

也就是说:超过50项,一定存在3个数可以组成三角形!

所以,我们在函数头部添加一句:

if(deep[x]+deep[y]-2*deep[lca]>=50)return true;

即可。

注意:由于点权是231以内,所以要将判断组成三角形的式子移个项,不然会爆int。

附代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#define MAXN 100010
using namespace std;
int n,m,c=1;
int val[MAXN],head[MAXN],deep[MAXN],son[MAXN],size[MAXN],fa[MAXN],top[MAXN];
struct node{int next,to;
}a[MAXN<<1];
inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;
}
inline void add(int x,int y){a[c].to=y;a[c].next=head[x];head[x]=c++;a[c].to=x;a[c].next=head[y];head[y]=c++;
}
void dfs1(int rt){son[rt]=0;size[rt]=1;for(int i=head[rt];i;i=a[i].next){int will=a[i].to;if(!deep[will]){deep[will]=deep[rt]+1;fa[will]=rt;dfs1(will);size[rt]+=size[will];if(size[son[rt]]<size[will])son[rt]=will;}}
}
void dfs2(int rt,int f){top[rt]=f;if(son[rt])dfs2(son[rt],f);for(int i=head[rt];i;i=a[i].next){int will=a[i].to;if(will!=fa[rt]&&will!=son[rt])dfs2(will,will);}
}
int LCA(int x,int y){while(top[x]!=top[y]){if(deep[top[x]]<deep[top[y]])swap(x,y);x=fa[top[x]];}if(deep[x]>deep[y])swap(x,y);return x;
}
bool solve(int x,int y){int lca=LCA(x,y);if(deep[x]+deep[y]-2*deep[lca]>=50)return true;int top=0,num[55];num[++top]=val[lca];for(int i=x;i!=lca;i=fa[i])num[++top]=val[i];for(int i=y;i!=lca;i=fa[i])num[++top]=val[i];sort(num+1,num+top+1);if(top<3)return false;for(int i=3;i<=top;i++)if(num[i]-num[i-1]<num[i-2])return true;return false;
}
void work(){int f,x,y;while(m--){f=read();x=read();y=read();if(f==0){if(solve(x,y))printf("Y\n");else printf("N\n");}if(f==1)val[x]=y;}
}
void init(){int x,y;n=read();m=read();for(int i=1;i<=n;i++)val[i]=read();for(int i=1;i<n;i++){x=read();y=read();add(x,y);}deep[1]=1;dfs1(1);dfs2(1,1);
}
int main(){init();work();return 0;
}

 

转载于:https://www.cnblogs.com/Yangrui-Blog/p/9097139.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS 背景透明

一、首先说下CSS实现背景全透明 全透明比较好实现。在要实现透明功能的id或Class里&#xff0c;输入 {background:transparent;}在IE、Firefox等浏览器下都有效果。二、再来说下CSS实现背景半透明 可以实现自定义的透明程度&#xff0c;代码如下&#xff1a; { filter:alpha(op…

万能红外遥控开发

下班刚回到家&#xff0c;天气很热~空调遥控器呢&#xff1f;找不到&#xff01;躺平不想动~风扇遥控器呢&#xff1f;找不到&#xff01;想看电视&#xff0c;不想动~电视遥控器呢&#xff1f;找不到&#xff01;好不容易找到了&#xff0c;遥控器没电&#xff1f;崩溃&#x…

每日一题(38)—— 一个32位的机器,该机器的指针是多少位?

一个32位的机器,该机器的指针是多少位&#xff1f; 指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。

简单的用户登录(一)

用来实现一个用户登录&#xff0c;这里要实现的是&#xff0c;输入用户名和密码&#xff0c;提交后&#xff0c;验证两者是否正确。 这里直接对表单提交的二者进行字符串判断&#xff0c;不涉及商业层活动。 实现项&#xff1a; 1 表单提交 2 获取表单提交值 3 客户端判断不为空…

[Lydsy1805月赛] 对称数

挺不错的一道数据结构题QWQ。 一开始发现这个题如果不看数据范围的话&#xff0c;妥妥的树上莫队啊23333&#xff0c;然鹅10组数据是不可能让你舒舒服服的树上莫队卡过的23333 于是想了想&#xff0c;这个题的模型就是&#xff0c;把u到v链上的权值出现奇偶次的01串搞出来&…

linux下被遗忘的gpio_keys按键驱动

我们新项目硬件设计上使用gpio口做按键&#xff0c;所以我就需要搞定这个驱动&#xff0c;本来想自己写一个gpio口的按键驱动&#xff0c;然后看了下内核下面的代码&#xff0c;已经有现成的了。Linux内核下游很多很多的现成驱动&#xff0c;只要你想得到的&#xff0c;基本都是…

如何通过审计安全事件日志检测密码喷洒(Password Spraying)攻击

许多渗透测试人员和攻击者通常都会使用一种被称为“密码喷洒&#xff08;Password Spraying&#xff09;”的技术来进行测试和攻击。对密码进行喷洒式的攻击&#xff0c;这个叫法很形象&#xff0c;因为它属于自动化密码猜测的一种。这种针对所有用户的自动密码猜测通常是为了避…

每日一题(39)—— sizeof

以下代码中的两个sizeof用法有问题吗&#xff1f; void UpperCase(char str[]) {for(size_t i 0; i < sizeof(str)/sizeof(str[0]); i){str[i] - (a - A);} }char str[] "aBcDe"; cout << "str字符长度为: " << sizeof(str)/sizeof(str[…

IT综合管理 新时期的运维管理思路

IT运维管理给企业带来效益已经有十余载的历史&#xff0c;IT部门也逐步成为为企业的重要支撑部门&#xff0c;通过IT部门管理好企业的网络、桌面、业务、机房环境以及其他IT资源。虽然IT运维管理已经给企业带来了节能增效的实际效益&#xff0c;但这些效益正增着IT规模的与日俱…

单片机编程技巧—状态机编程

摘要&#xff1a;不知道大家有没有这样一种感觉&#xff0c;就是感觉自己玩单片机还可以&#xff0c;各个功能模块也都会驱动&#xff0c;但是如果让你完整的写一套代码&#xff0c;却无逻辑与框架可言&#xff0c;上来就是开始写&#xff01;东抄抄写抄抄。说明编程还处于比较…

啥叫旁路电容?啥叫去耦?可以不再争论了吗

1. 旁路和去耦先谈两个比较重要的概念&#xff1a;旁路电容(Bypass Capacitor)&#xff0c;去耦电容(Decoupling Capacitor)。只要是设计过硬件电路的同学肯定对这两个词不陌生&#xff0c;但真正理解这两个概念的可能并不多。我刚毕业时就问过我的师傅&#xff0c;为什么总是在…

H5活动产品设计指南基础版

本文来自 网易云社区 。 H5一般页面不会很多&#xff0c;看似简单&#xff0c;实际上会有很多细节需要注意&#xff0c;我自己在做过了几个H5之后&#xff0c;发现了一些常犯的问题&#xff0c;做了小结&#xff0c;希望给新开始做H5的产品相关的同学提供一些帮助。 首先说说一…

每日一题(40)—— 字符串常量

下列代码有什么问题&#xff1f; char* s"AAA"; printf("%s",s); s[0]B; printf("%s",s);"AAA"是字符串常量。s是指针&#xff0c;指向这个字符串常量&#xff0c;所以声明s的时候就有问题。 cosntchar* s"AAA"; 然后又因…

下一个天亮

下一个天亮&#xff0c;我们依然是最好的搭档。最初的梦想&#xff0c;永远也从来不曾放弃。谢谢你教会我成长&#xff0c;谢谢你给我的一切。我们要永远这么好下去。加油哦。原来有些话真的只适合烂在心底。我能选择的&#xff0c;从始至终的唯一选择&#xff0c;只有坚强&…

图解丨在嵌入式设备上实现HTTP服务器

您好呀&#xff0c;我是小二。本期为大家带来一个 WiFi 应用的实际场景&#xff0c;其实在之前「我对 WiFi 驱动移植过程&#xff0c;做了一次总结复盘」这篇文章中有简单提过&#xff0c;但由于内容较多&#xff0c;就单独摘出来了。来自读者的催更????????????&a…

maven详解之仓库

在Maven中&#xff0c;任何一个依赖、插件或者项目构建的输出&#xff0c;都可以称之为构件。 Maven在某个统一的位置存储所有项目的共享的构件&#xff0c;这个统一的位置&#xff0c;我们就称之为仓库。&#xff08;仓库就是存放依赖和插件的地方&#xff09; 任何的构件都有…

Linux内核代码,第一次看到这样使用的宏

晚上看内核代码&#xff0c;看到一个有意思的宏&#xff0c;我之前没有见到过&#xff0c;当然&#xff0c;肯定有人见到过&#xff0c;我写出来是给那些没有看到过的人看的。我说是深夜&#xff0c;那就肯定是深夜代码是从内核里面看到的我们正常使用宏是这样的C语言、嵌入式中…

学习笔记三

三、信息安全风险管理的风险评估<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1、风险评估概述A、风险评估的概念风险评估是信息安全风险管理的第二步&#xff0c;针对确立的风险管理对象所面临的风险进行识别、分析和评价。请…

每日一题(41)—— 数组和链表的区别

数组和链表的区别&#xff1a; 数组&#xff1a;数据顺序存储&#xff0c;固定大小 连表&#xff1a;数据可以随机存储&#xff0c;大小可动态改变

flex柱状图和折线图的混合图使用

<?xml version"1.0"?> <mx:Application xmlns:mx"http://www.adobe.com/2006/mxml"> <mx:Script> <!--[CDATA[ import mx.collections.ArrayCollection; [Bindable] public var data1:ArrayCollectionnew ArrayCollection([{date:&…