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根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
随机推荐
- 用PROXYCHAINS实现SSH全局代理
NUX下可以实现SSH全局代理的软件有tsocks和proxychains两种,但是个人感觉proxychains要更加稳定简单. $ yum install proxychains # vim /e ...
- 【Python】删除字符串的空白
在程序中,额外的空白可能让人迷惑,对于程序员来说,'python'跟'python '看起来几乎一样,但是对于程序来说,可是千差万别 (lstrip)删除开头空白 >>> Langu ...
- Node.js学习笔记(4)——除了HTTP(服务器和客户端)部分
很多node入门的书里面都会在介绍node特性的时候说:单线程,异步式I/O,事件驱动. Node不是一门语言,它是运行在服务器端的开发平台,官方指定语言为javascript. 阻塞和线程: 线程在 ...
- SPA路由机制详解(看不懂不要钱~~)
前言 总所周知,随着前端应用的业务功能起来越复杂,用户对于使用体验的要求越来越高,单面(SPA)成为前端应用的主流形式.而大型单页应用最显著特点之一就是采用的前端路由跳转子页面系统,通过改变页面的UR ...
- Android MarginLeft与MarginStart的差别
在写layout布局的时候,我们会发现有这样几个比較相似的属性: MarginStart MarginLeft MarginEnd MarginRight 这些属性的差别是什么? 依据ap ...
- jquery列表自动加载更多
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- android开发系列之数据存储
在我们的android实际开发过程,必不可少的一种行为操作对象就是数据.有些数据,对于用户而言是一次性的,这就要求我们每次进到App的时候,都需要去刷新数据.有些数据,对于用户而言又是具有一定时效性的 ...
- zeroMQ研究(转)
偶尔一个机会,了解了下zeroMQ消息队列. 1 ZeroMQ概述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型.连接处理.帧.甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接 ...
- FloatingActionButton 完全解析
鸿洋大神说的很明白这里就直接引用一下: FloatingActionButton 完全解析[Design Support Library(2)]
- HDOJ 题目3564 Another LIS(线段树单点更新,LIS)
Another LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...