3251: 树上三角形

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 637  Solved: 262
[Submit][Status][Discuss]

Description

给定一大小为n的有点权树,每次询问一对点(u,v),问是否能在u到v的简单路径上取三个点权,以这三个权值为边长构成一个三角形。同时还支持单点修改。
 

Input

第一行两个整数n、q表示树的点数和操作数
第二行n个整数表示n个点的点权
以下n-1行,每行2个整数a、b,表示a是b的父亲(以1为根的情况下)
以下q行,每行3个整数t、a、b
若t=0,则询问(a,b)
若t=1,则将点a的点权修改为b

Output

对每个询问输出一行表示答案,“Y”表示有解,“N”表示无解。

Sample Input

5 5
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

N
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,否则暴力判断是否存在

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define N 200010
  5. struct edge
  6. {
  7. int to,nxt;
  8. }e[N];
  9. int n,q,cnt=;
  10. int dep[N],head[N];
  11. ll key[N];
  12. int fa[N][];
  13. inline bool cp(ll x,ll y)
  14. {
  15. return x<y;
  16. }
  17. inline void link(int u,int v)
  18. {
  19. e[++cnt].nxt=head[u];
  20. head[u]=cnt;
  21. e[cnt].to=v;
  22. }
  23. inline void change(int a,int b) { key[a]=b;}
  24. inline void dfs(int u,int last)
  25. {
  26. for(int i=head[u];i;i=e[i].nxt) if(e[i].to!=last)
  27. {
  28. int v=e[i].to;
  29. fa[v][]=u;
  30. dep[v]=dep[u]+;
  31. dfs(v,u);
  32. }
  33. }
  34. inline int lca(int u,int v)
  35. {
  36. if(dep[u]<dep[v]) swap(u,v);
  37. for(int i=;i>=;i--)
  38. if((dep[u]-dep[v])&(<<i)) u=fa[u][i];
  39. if(u==v) return u;
  40. for(int i=;i>=;i--) if(fa[u][i]!=fa[v][i])
  41. {
  42. u=fa[u][i]; v=fa[v][i];
  43. }
  44. return fa[u][];
  45. }
  46. inline void query(int a,int b)
  47. {
  48. int x=lca(a,b);
  49. if(dep[a]+dep[b]-*dep[x]+>)
  50. {
  51. puts("Y");
  52. return;
  53. }
  54. vector<ll> num; num.clear();
  55. for(int p=a;p!=x;p=fa[p][]) num.push_back(key[p]);
  56. for(int p=b;p!=x;p=fa[p][]) num.push_back(key[p]);
  57. num.push_back(key[x]);
  58. if(num.size()<)
  59. {
  60. puts("N");
  61. return;
  62. }
  63. sort(num.begin(),num.end(),cp);
  64. for(int i=;i<num.size()-;i++) if(num[i]+num[i+]>num[i+])
  65. {
  66. puts("Y");
  67. return;
  68. }
  69. puts("N");
  70. }
  71.  
  72. int main()
  73. {
  74. memset(fa,-,sizeof(fa));
  75. scanf("%d%d",&n,&q);
  76. for(int i=;i<=n;i++) scanf("%d",&key[i]);
  77. for(int i=;i<n;i++)
  78. {
  79. int u,v; scanf("%d%d",&u,&v);
  80. link(u,v); link(v,u);
  81. }
  82. dfs(,);
  83. for(int i=;i<=;i++)
  84. for(int j=;j<=n;j++) if(fa[j][i-]!=-)
  85. fa[j][i]=fa[fa[j][i-]][i-];
  86. while(q--)
  87. {
  88. int opt,a,b; scanf("%d%d%d",&opt,&a,&b);
  89. if(opt==) query(a,b);
  90. if(opt==) change(a,b);
  91. }
  92. return ;
  93. }

bzoj3251的更多相关文章

  1. 【BZOJ3251】树上三角形 暴力

    [BZOJ3251]树上三角形 Description 给定一大小为n的有点权树,每次询问一对点(u,v),问是否能在u到v的简单路径上取三个点权,以这三个权值为边长构成一个三角形.同时还支持单点修改 ...

  2. BZOJ3251 : 树上三角形

    BZOJ AC1000题纪念~~~ 将x到y路径上的点权从小到大排序 如果不存在b[i]使得b[i]+b[i+1]>b[i+2]则无解 此时b数列增长速度快于斐波那契数列,当达到50项时就会超过 ...

  3. BZOJ3251:树上三角形(乱搞)

    Description 给定一大小为n的有点权树,每次询问一对点(u,v),问是否能在u到v的简单路径上取三个点权,以这三个权值为边长构成一个三角形.同时还支持单点修改. Input 第一行两个整数n ...

  4. 树上三角形 BZOJ3251

    分析: 模拟赛T3,其实很水,当时出于某些原因,没有去写这道题... len>46必定有解 为了满足不是三角形,那么斐波那契数列是最优选择,而斐波那契数列的第46项超过了2^31-1,所以超过4 ...

  5. bzoj3251: 树上三角形(思维题)

    神tmWA了8发调了20min才发现输出没回车T T... 首先考虑一段什么样的序列才会是N... 显然最长的形式就是斐波那契,前两数之和等于第三数之和,这样就无法组成三角形并且序列最长.可以发现在i ...

  6. 【bzoj3251】树上三角形 朴素LCA+暴力

    题目描述 给定一大小为n的有点权树,每次询问一对点(u,v),问是否能在u到v的简单路径上取三个点权,以这三个权值为边长构成一个三角形.同时还支持单点修改. 输入 第一行两个整数n.q表示树的点数和操 ...

  7. [转载]hzwer的bzoj题单

    counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ120 ...

  8. BZOJ刷题列表【转载于hzwer】

    沿着黄学长的步伐~~ 红色为已刷,黑色为未刷,看我多久能搞完吧... Update on 7.26 :之前咕了好久...(足见博主的flag是多么emmm......)这几天开始会抽时间刷的,每天几道 ...

随机推荐

  1. bzoj1709 [Usaco2007 Oct]Super Paintball超级弹珠 暴力

    [Usaco2007 Oct]Super Paintball超级弹珠 Description 奶牛们最近从著名的奶牛玩具制造商Tycow那里,买了一套仿真版彩弹游戏设备(类乎于真人版CS). Bess ...

  2. BZOJ1777: [Usaco2010 Hol]rocks 石头木头

    n<=10000的树,节点有初始石头数<=1000,进行这样的游戏:两人轮流行动,我先手,每次可以选一个节点(≠1)把不超过m<=1000个石头移到父亲,最后所有石头都在节点1,没法 ...

  3. jQuery的对象访问函数(get,index,size,each)

    1.get() 元素集合 取得所有匹配的 DOM 元素集合. 这是取得所有匹配元素的一种向后兼容的方式(不同于jQuery对象,而实际上是元素数组). 如果你想要直接操作 DOM 对象而不是 jQue ...

  4. Catch The Caw——(广度优先搜索的应用,队列)

    抓住那头牛(POJ3278)农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有 ...

  5. Java面试题,深入理解final关键字

    final关键字 final的简介 final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一个final类型的类. final的具体使用场景 fina ...

  6. 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版)

    TableGo v6.0.0 版震撼发布,此次版本更新如下: 1.UI界面大改版,组件大调整,提升界面功能的可扩展性. 2.新增BeautyEye主题,界面更加清新美观,也可以通过配置切换到原生Jav ...

  7. MongoDB学习day09--Mongoose数据校验

    一.Mongoose检验参数 required : 表示这个数据必须传入max: 用于 Number 类型数据, 最大值 min: 用于 Number 类型数据, 最小值 enum:枚举类型, 要求数 ...

  8. guava缓存设置return null一直报错空指针

    guava缓存设置return null一直报错空指针 因为缓存不允许返回为空

  9. 系统性能不够原因可能是cpu不够,内存不够等等

    1.Linux系统可以通过top命令查看系统的CPU.内存.运行时间.交换分区.执行的线程等信息. 通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高. 2. ...

  10. 学习swift从青铜到王者之Swift控制语句04

    1 if语句基本用法 if boolean_expression { /* 如果布尔表达式为真将执行的语句 */ } 如果布尔表达式为 true,则 if 语句内的代码块将被执行.如果布尔表达式为 f ...