BZOJ 3251 树上三角形:LCA【构成三角形的结论】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3251
题意:
给你一棵树,n个节点,每个点的权值为w[i]。
接下来有m个形如(p,a,b)的操作:
(1)p == 0:
问你在从a到b的路径上,有没有三个点满足:它们的权值大小可以构成三角形。
如果有,输出'Y',否则输出'N'。
(2)p == 1:
将点a的权值w[a]改为b。
题解:
首先考虑一个结论:
因为构成三角形的充要条件是:对于三个数a < b < c,满足a + b > c。
所以不能构成三角形的条件是:对于三个数a < b < c,满足a + b <= c。
所以对于一个升序数列a[i],让a[i]的增加速度最小,则类似于斐波那契数列:1,1,2,3,5,8,13...
又因为点权范围为[1,2^31-1],所以一个不能构成三角形的数列,最多有大约45个数字。
即:对于数字个数 >= 50的数列,必定有三个数能构成三角形。
所以先找出(a,b)的最近公共祖先act,然后顺着路径最多取50个数。
然后sort一遍取出的数t[i],扫一遍有没有t[i-2]+t[i-1]>t[i]。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#define MAX_N 100005
#define MAX_K 20 using namespace std; int n,m;
int w[MAX_N];
int t[MAX_N];
int dep[MAX_N];
int par[MAX_K][MAX_N];
vector<int> edge[MAX_N]; void read()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&w[i]);
}
int a,b;
for(int i=;i<n-;i++)
{
scanf("%d%d",&a,&b);
edge[a].push_back(b);
}
} void dfs(int now,int p,int d)
{
dep[now]=d;
par[][now]=p;
for(int i=;i<edge[now].size();i++)
{
int temp=edge[now][i];
if(temp!=p) dfs(temp,now,d+);
}
} void init_lca(int root)
{
dfs(root,-,);
for(int k=;k+<MAX_K;k++)
{
for(int i=;i<=n;i++)
{
if(par[k][i]==-) par[k+][i]=-;
else par[k+][i]=par[k][par[k][i]];
}
}
} int lca(int a,int b)
{
if(dep[a]>dep[b]) swap(a,b);
for(int k=;k<MAX_N && dep[a]!=dep[b];k++)
{
if(((dep[b]-dep[a])>>k)&)
{
b=par[k][b];
}
}
if(a==b) return a;
for(int k=MAX_K-;k>=;k--)
{
if(par[k][a]!=par[k][b])
{
a=par[k][a];
b=par[k][b];
}
}
return par[][a];
} bool check(int a,int b,int act)
{
int cnt=;
t[cnt++]=w[act];
int now=a;
while(now!=act)
{
t[cnt++]=w[now];
now=par[][now];
if(cnt>) break;
}
now=b;
while(now!=act)
{
t[cnt++]=w[now];
now=par[][now];
if(cnt>) break;
}
sort(t,t+cnt);
for(int i=;i<cnt;i++)
{
if((long long)t[i-]+t[i-]>t[i]) return true;
}
return false;
} void work()
{
init_lca();
int p,a,b;
for(int i=;i<m;i++)
{
scanf("%d%d%d",&p,&a,&b);
if(p==)
{
int act=lca(a,b);
if(check(a,b,act)) printf("Y\n");
else printf("N\n");
}
else w[a]=b;
}
} int main()
{
read();
work();
}
BZOJ 3251 树上三角形:LCA【构成三角形的结论】的更多相关文章
- BZOJ 3251 树上三角形
NOIP的东西回成都再说吧... 这题暴力. #include<iostream> #include<cstdio> #include<cstring> #incl ...
- BZOJ 3505 【Cqoi2014】 数三角形
Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m ...
- [BZOJ 3307]Cow Politics (LCA)
[BZOJ 3307]Cow Politics (LCA) 题面 给出一棵N个点的树,树上每个节点都有颜色.对于每种颜色,求该颜色距离最远的两个点之间的距离.N≤200000 分析 显然对于每种颜色建 ...
- 【bzoj4281】[ONTAK2015]Związek Harcerstwa Bajtockiego 树上倍增+LCA
题目描述 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点.之后你将依次收到k个指令,每个指令包含两个整数d和t,你需要沿着最短路在t步之内(包含t步)走到d点,如果不能走到,则停在 ...
- 03->OpenGL多边形,glut实现三角形条带和三角形扇
图形学中基本图元是多边形,一般要求是凸多边形,三角形是最简单的凸多边形,在图形渲染中比一般多边形其绘制速度快.今天学习OpenGL绘制三角形条带和三角形扇基础.编程环境! 1. 三角形条带 指定顶点序 ...
- 纯CSS制作空心三角形和实心三角形及其实现原理
纯CSS制作空心三角形和实心三角形及其实现原理 在一次项目中需要使用到空心三角形,我瞬间懵逼了.查阅了一些资料加上自己的分析思考,终于是达到了效果,个人感觉制作三角形是使用频率很高的,因此记录下来,供 ...
- C#中画三角形和填充三角形的简单实现
C#中画三角形和填充三角形的简单实现: private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graph ...
- BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Submit: 1388 Solved: 860 [Submit][Stat ...
- BZOJ 3631: [JLOI2014]松鼠的新家 树上差分 + LCA
Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
随机推荐
- vue2.0 引用qrcode.js实现获取改变二维码的样式
vue代码 <template> <div class="qart"> <div id="qrcode" ref="qr ...
- remove-duplicates-from-sorted-array-ii——去除重复
Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For exampl ...
- 15:取近似值ApproximateValue
题目描述 写出一个程序,接受一个正浮点数值,输出该数值的近似整数值.如果小数点后数值大于等于5,向上取整:小于5,则向下取整. 输入描述:输入一个正浮点数值 输出描述:输出该数值的近似整数值 输入例子 ...
- Command &Prompt Here
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\Command Prompt Here]@=" ...
- leetCode 84.Largest Rectangle in Histogram (最大矩形直方图) 解题思路和方法
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- 【Linux】 awk应用
1 统计机器上处于不同状态的所有TCP连接的个数(TCP连接是有状态连接,包含SYN_RECV, ESTABLISHED, TIME_WAIT, FIN_WAIT0, FIN_WAIT1等多种状态, ...
- NorFlash linux分区分析
一般情况下,与板卡相关的内容都在bsp中(即arch/arm/mach-xxx/board-xxx.c)中,但norflash的分区直接放在norflash驱动中.由于norflash应用基于mtd, ...
- pm2 服务崩溃 Error: bind EADDRINUSE
pm2 服务崩溃 Error: bind EADDRINUSE 发布于 1 年前 作者 zhujun24 2444 次浏览 来自 问答 Error: bind EADDRINUSE 0.0.0 ...
- ASP.NET动态网站制作(3)--css(2)
前言:css分为四次课讲完,第一节课内容见ASP.NET动态网站制作(2)--css(1),接下来的内容会涉及到定位.浮动.盒子模型(第二次课).css的具体应用(第三次课).css3(第四次课).今 ...
- Android-解决Fail to post notification on channel "null"的方法
原文:https://blog.csdn.net/weixin_40604111/article/details/78674563 在sdk版本为25或25之前想在notification中添加一个点 ...