题目链接: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. 关于Blind XXE

    关于Blind XXE 关于XXE,很早之前内部做过分享,个人觉得漏洞本身没太多的玩点,比较有意思主要在于:不同语言处理URI的多元化和不同XML解析器在解析XML的一些特性. 在科普Blind XX ...

  2. 关于insert|update|delete注入中的tips

    2.updatexml().extractvalue().name_const()函数的使用 3.I’ve noticed some variations in our payload. You ca ...

  3. java debug

    java debug 模式下各button作用 F5:跳入方法  Step Into F6:向下逐行调试  Step Over F7:跳出方法  Step Return F8:直接跳转到下一个断点 D ...

  4. mybatis性能优化之降低数据库连接

    做性能优化的最重要的功能就是降低数据库的交互.非常多程序猿一般在开发的时候仅仅考虑简单的实现功能,无论业务简单复杂,仅仅要实现即可. mybatis有个重要的功能就是考虑在联合查询时技巧: <? ...

  5. Selenium详解

    自动化测试工具,支持多种浏览器.爬虫中主要用来解决JavaScript渲染的问题. 主要是操控流量器,让浏览器做一些点击啊.加载渲染js啊,之类的.

  6. Android之Intent和Activity

    Intent能够说是Android的灵魂,程序跳转和传递数据的时候基本上就是靠Intent了.Intent在Android应用中是相当重要的,理解Intent相应用编程非常有帮助.在Android的官 ...

  7. Django之中间件-CSRF

    CSRF a.CSRF原理 post提交时需要提交csrf_token ,缺少则不通过 在form表单中加入: {% csrf_token %} b.无CSRF时存在隐患 防护其他人通过别的链接pos ...

  8. rtems 4.11 时钟驱动(arm, beagle)

    根据bsp_howto手册,时钟驱动的框架主要在 c/src/lib/libbsp/shared/Clockdrv_shell.h 文件中实现 时钟初始化 时钟驱动初始化函数为 Clock_initi ...

  9. java 表示当前时间的第二天的几点

    Calendar cal = Calendar.getInstance();  cal.setTime(new Date());  cal.add(Calendar.DAY_OF_YEAR, 1);  ...

  10. 【selenium+Python unittest】之发送带中文附件的邮箱

    完整原码如下: import smtplib from email.mime.text import MIMEText #from email.header import Header from em ...