bzoj3251
3251: 树上三角形
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 637 Solved: 262
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 3 4 5
1 2
2 3
3 4
1 5
0 1 3
0 4 5
1 1 4
0 2 5
0 2 3
Sample Output
Y
Y
N
HINT
对于100%的数据,n,q<=100000,点权范围[1,231-1]
Source
这道题很脑洞。。。首先点权的范围不超过int,如果我们想构造一个序列,正好任意三个构不成三角形,则数列是这个样子的:f[n+2]=f[n+1]+f[n] 这就是斐波那契数列,n在50左右就爆int了,所以
当n>50说明肯定是满足的,直接输出Y,否则暴力判断是否存在
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- #define N 200010
- struct edge
- {
- int to,nxt;
- }e[N];
- int n,q,cnt=;
- int dep[N],head[N];
- ll key[N];
- int fa[N][];
- inline bool cp(ll x,ll y)
- {
- return x<y;
- }
- inline void link(int u,int v)
- {
- e[++cnt].nxt=head[u];
- head[u]=cnt;
- e[cnt].to=v;
- }
- inline void change(int a,int b) { key[a]=b;}
- inline void dfs(int u,int last)
- {
- for(int i=head[u];i;i=e[i].nxt) if(e[i].to!=last)
- {
- int v=e[i].to;
- fa[v][]=u;
- dep[v]=dep[u]+;
- dfs(v,u);
- }
- }
- inline int lca(int u,int v)
- {
- if(dep[u]<dep[v]) swap(u,v);
- for(int i=;i>=;i--)
- if((dep[u]-dep[v])&(<<i)) u=fa[u][i];
- if(u==v) return u;
- for(int i=;i>=;i--) if(fa[u][i]!=fa[v][i])
- {
- u=fa[u][i]; v=fa[v][i];
- }
- return fa[u][];
- }
- inline void query(int a,int b)
- {
- int x=lca(a,b);
- if(dep[a]+dep[b]-*dep[x]+>)
- {
- puts("Y");
- return;
- }
- vector<ll> num; num.clear();
- for(int p=a;p!=x;p=fa[p][]) num.push_back(key[p]);
- for(int p=b;p!=x;p=fa[p][]) num.push_back(key[p]);
- num.push_back(key[x]);
- if(num.size()<)
- {
- puts("N");
- return;
- }
- sort(num.begin(),num.end(),cp);
- for(int i=;i<num.size()-;i++) if(num[i]+num[i+]>num[i+])
- {
- puts("Y");
- return;
- }
- puts("N");
- }
- int main()
- {
- memset(fa,-,sizeof(fa));
- scanf("%d%d",&n,&q);
- for(int i=;i<=n;i++) scanf("%d",&key[i]);
- for(int i=;i<n;i++)
- {
- int u,v; scanf("%d%d",&u,&v);
- link(u,v); link(v,u);
- }
- dfs(,);
- for(int i=;i<=;i++)
- for(int j=;j<=n;j++) if(fa[j][i-]!=-)
- fa[j][i]=fa[fa[j][i-]][i-];
- while(q--)
- {
- int opt,a,b; scanf("%d%d%d",&opt,&a,&b);
- if(opt==) query(a,b);
- if(opt==) change(a,b);
- }
- return ;
- }
bzoj3251的更多相关文章
- 【BZOJ3251】树上三角形 暴力
[BZOJ3251]树上三角形 Description 给定一大小为n的有点权树,每次询问一对点(u,v),问是否能在u到v的简单路径上取三个点权,以这三个权值为边长构成一个三角形.同时还支持单点修改 ...
- BZOJ3251 : 树上三角形
BZOJ AC1000题纪念~~~ 将x到y路径上的点权从小到大排序 如果不存在b[i]使得b[i]+b[i+1]>b[i+2]则无解 此时b数列增长速度快于斐波那契数列,当达到50项时就会超过 ...
- BZOJ3251:树上三角形(乱搞)
Description 给定一大小为n的有点权树,每次询问一对点(u,v),问是否能在u到v的简单路径上取三个点权,以这三个权值为边长构成一个三角形.同时还支持单点修改. Input 第一行两个整数n ...
- 树上三角形 BZOJ3251
分析: 模拟赛T3,其实很水,当时出于某些原因,没有去写这道题... len>46必定有解 为了满足不是三角形,那么斐波那契数列是最优选择,而斐波那契数列的第46项超过了2^31-1,所以超过4 ...
- bzoj3251: 树上三角形(思维题)
神tmWA了8发调了20min才发现输出没回车T T... 首先考虑一段什么样的序列才会是N... 显然最长的形式就是斐波那契,前两数之和等于第三数之和,这样就无法组成三角形并且序列最长.可以发现在i ...
- 【bzoj3251】树上三角形 朴素LCA+暴力
题目描述 给定一大小为n的有点权树,每次询问一对点(u,v),问是否能在u到v的简单路径上取三个点权,以这三个权值为边长构成一个三角形.同时还支持单点修改. 输入 第一行两个整数n.q表示树的点数和操 ...
- [转载]hzwer的bzoj题单
counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ120 ...
- BZOJ刷题列表【转载于hzwer】
沿着黄学长的步伐~~ 红色为已刷,黑色为未刷,看我多久能搞完吧... Update on 7.26 :之前咕了好久...(足见博主的flag是多么emmm......)这几天开始会抽时间刷的,每天几道 ...
随机推荐
- bzoj1709 [Usaco2007 Oct]Super Paintball超级弹珠 暴力
[Usaco2007 Oct]Super Paintball超级弹珠 Description 奶牛们最近从著名的奶牛玩具制造商Tycow那里,买了一套仿真版彩弹游戏设备(类乎于真人版CS). Bess ...
- BZOJ1777: [Usaco2010 Hol]rocks 石头木头
n<=10000的树,节点有初始石头数<=1000,进行这样的游戏:两人轮流行动,我先手,每次可以选一个节点(≠1)把不超过m<=1000个石头移到父亲,最后所有石头都在节点1,没法 ...
- jQuery的对象访问函数(get,index,size,each)
1.get() 元素集合 取得所有匹配的 DOM 元素集合. 这是取得所有匹配元素的一种向后兼容的方式(不同于jQuery对象,而实际上是元素数组). 如果你想要直接操作 DOM 对象而不是 jQue ...
- Catch The Caw——(广度优先搜索的应用,队列)
抓住那头牛(POJ3278)农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有 ...
- Java面试题,深入理解final关键字
final关键字 final的简介 final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一个final类型的类. final的具体使用场景 fina ...
- 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版)
TableGo v6.0.0 版震撼发布,此次版本更新如下: 1.UI界面大改版,组件大调整,提升界面功能的可扩展性. 2.新增BeautyEye主题,界面更加清新美观,也可以通过配置切换到原生Jav ...
- MongoDB学习day09--Mongoose数据校验
一.Mongoose检验参数 required : 表示这个数据必须传入max: 用于 Number 类型数据, 最大值 min: 用于 Number 类型数据, 最小值 enum:枚举类型, 要求数 ...
- guava缓存设置return null一直报错空指针
guava缓存设置return null一直报错空指针 因为缓存不允许返回为空
- 系统性能不够原因可能是cpu不够,内存不够等等
1.Linux系统可以通过top命令查看系统的CPU.内存.运行时间.交换分区.执行的线程等信息. 通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高. 2. ...
- 学习swift从青铜到王者之Swift控制语句04
1 if语句基本用法 if boolean_expression { /* 如果布尔表达式为真将执行的语句 */ } 如果布尔表达式为 true,则 if 语句内的代码块将被执行.如果布尔表达式为 f ...