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根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
随机推荐
- mysql数据库解决中文乱码问题
安装mysql之后.假设存储中文.再读出的时候就会出现乱码问题. 如今的字符集有几百种之多,都是一些公司或者组织定义的. 我们应该使用可以容纳世界所有语言所有字符的字符集,这样就不会再出现乱码问题. ...
- websocket关于禁止一个账号多窗口链接的问题
通过websocket的session.getSessionId()与oldSession.getSessionId()来equals判断是否是新窗口. 如果不同不让链接. 问题1.虽然新来的链接连不 ...
- vue 组件创建与销毁
vue 组件(如对话框组件)实时创建与销毁: 使用v-if <search-history :show="showSearchHistory" @close="sh ...
- php信号处理
pcntl pcntl_signal 信号注册函数 pcntl_alarm 指定秒数中断程序执行任务. 每次执行只会有一个定时器生效,若之前计时器还没结束就定义新定时器,会替代之前定时器并返回之前定时 ...
- Linux进入单用户模式
有时候配置linux的过程中,因为一些误操作导致系统初始化时堵塞或挂起而无法进入系统,原因往往是因为配置文件设置错误,部分文件被误删之类.遇到这种情况一般新手的做法就是重装(虚拟机不装白不装),但在实 ...
- Codeforces 390E Inna and Large Sweet Matrix 树状数组改段求段
题目链接:点击打开链接 题意:给定n*m的二维平面 w个操作 int mp[n][m] = { 0 }; 1.0 (x1,y1) (x2,y2) value for i : x1 to x2 for ...
- http协议详解-经典篇
本文转载至 http://www.cnblogs.com/flychen/archive/2012/11/28/2792206.html ————————————————————————————— ...
- T-SQL简单查询语句(模糊查询)
T-SQL简单查询语句 简单查询: 1.最简单查询(查所有数据) select * from 表名: 注:* 代表所有列 select * from info 2.查询指定列 select code, ...
- scrapy架构解析
- ES mapping映射及优化
mapping映射 主要类型: 同一index下,不同type中如果有相同filed:es进行mapping映射的时候,按照先写进去的指定类型:比如同一index,包含的type中都有key1字段,如 ...