题目链接: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【构成三角形的结论】的更多相关文章

  1. BZOJ 3251 树上三角形

    NOIP的东西回成都再说吧... 这题暴力. #include<iostream> #include<cstdio> #include<cstring> #incl ...

  2. BZOJ 3505 【Cqoi2014】 数三角形

    Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m ...

  3. [BZOJ 3307]Cow Politics (LCA)

    [BZOJ 3307]Cow Politics (LCA) 题面 给出一棵N个点的树,树上每个节点都有颜色.对于每种颜色,求该颜色距离最远的两个点之间的距离.N≤200000 分析 显然对于每种颜色建 ...

  4. 【bzoj4281】[ONTAK2015]Związek Harcerstwa Bajtockiego 树上倍增+LCA

    题目描述 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点.之后你将依次收到k个指令,每个指令包含两个整数d和t,你需要沿着最短路在t步之内(包含t步)走到d点,如果不能走到,则停在 ...

  5. 03->OpenGL多边形,glut实现三角形条带和三角形扇

    图形学中基本图元是多边形,一般要求是凸多边形,三角形是最简单的凸多边形,在图形渲染中比一般多边形其绘制速度快.今天学习OpenGL绘制三角形条带和三角形扇基础.编程环境! 1. 三角形条带 指定顶点序 ...

  6. 纯CSS制作空心三角形和实心三角形及其实现原理

    纯CSS制作空心三角形和实心三角形及其实现原理 在一次项目中需要使用到空心三角形,我瞬间懵逼了.查阅了一些资料加上自己的分析思考,终于是达到了效果,个人感觉制作三角形是使用频率很高的,因此记录下来,供 ...

  7. C#中画三角形和填充三角形的简单实现

    C#中画三角形和填充三角形的简单实现: private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graph ...

  8. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  9. BZOJ 3631: [JLOI2014]松鼠的新家 树上差分 + LCA

    Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...

随机推荐

  1. 日历插件js,jquery

    常用的日历插件 DatePicker My97DatePicker   文章来源:刘俊涛的博客 地址:http://www.cnblogs.com/lovebing 欢迎关注,有问题一起学习欢迎留言. ...

  2. Hadoop实战: Linux报 tmp 磁盘存储不足

    Linux 权限真是一大堆呀.在Linux下进行试验,突然来了个tmp磁盘存储不足..... .. .. ..... ... . 然而.我却没有权限给tmp添加容量.......... .. . 仅仅 ...

  3. 通过a标签(不丢失referrer)打开另一个窗口

    第一页 //这个是显示窗口的方法 function frmshow(arr){ var old; var val =$.trim($("#phone").val()); if (v ...

  4. jquery瀑布流布局插件,兼容ie6不支持下拉加载,用于制作分类卡

    调用方法 $('需要布局的块').sault() 如果要在图片加载后调用需要使用$(window).load(function(fx){});函数,即等待图片加载完成再调用 3个参数 1.left:左 ...

  5. python学习(九)python中的变量、引用和对象的关系

    <Think In Java>中说到过"万事万物皆对象",这句话也可以用在Python中. 感觉Python中的变量有点像Javascript中的变量,是弱类型的,但是 ...

  6. 【Python】用Python打开IE、谷歌等浏览器报错及解决办法

    以IE浏览器为例: 当Python Shell输入下面代码时: >>> # coding=utf-8 >>> from selenium import webdri ...

  7. gdb ../sysdeps/i386/elf/start.S: No such file or directory

    使用 gdb 调试的时候 输入 l 之后出现下列信息 (gdb) l 1 ../sysdeps/i386/elf/start.S: No such file or directory. in ../s ...

  8. WPF的ListView控件自定义布局用法实例

    正文: 如何布局是在App.xaml中定义源码如下 <Application x:Class="CWebsSynAssistant.App"   xmlns="ht ...

  9. Content encoding error问题解决方法

    A few people have been experiencing the following error. UPDATE: The reason for it happening is beca ...

  10. SQL ROW_NUMBER() 分页使用示例

    ALTER PROC [dbo].[TestProPage] , AS BEGIN SELECT * FROM (SELECT *,ROW_NUMBER() OVER(ORDER BY IndexID ...