CF1025D Recovering BST

题目描述

Dima the hamster enjoys nibbling different things: cages, sticks, bad problemsetters and even trees!

Recently he found a binary search tree and instinctively nibbled all of its edges, hence messing up the vertices. Dima knows that if Andrew, who has been thoroughly assembling the tree for a long time, comes home and sees his creation demolished, he'll get extremely upset.

To not let that happen, Dima has to recover the binary search tree. Luckily, he noticed that any two vertices connected by a direct edge had their greatest common divisor value exceed \(1\) .

Help Dima construct such a binary search tree or determine that it's impossible. The definition and properties of a binary search tree can be found here.

输入输出格式

输入格式:

The first line contains the number of vertices \(n\) ( \(2 \le n \le 700\) ).

The second line features \(n\) distinct integers \(a_i\) ( \(2 \le a_i \le 10^9\) ) — the values of vertices in ascending order.

输出格式:

If it is possible to reassemble the binary search tree, such that the greatest common divisor of any two vertices connected by the edge is greater than \(1\) , print "Yes" (quotes for clarity).

Otherwise, print "No" (quotes for clarity).


不错的区间DP题。

首先有个简单的区间DP思路

\(dp_{i,j,k}\)表示点\(i\)根,区间\([j,k]\)的合法性,然后每次枚举两个子区间的根进行转移。

但是我们发现,对于一个区间,它向外转移的时候只判断了根是否和区间左端点的左边一位合法,或者跟右端点的右边一位合法。

这启发我们把这个带入状态。

\(L_{i,j}\)代表区间\([i,j]\)是否有一个跟可以和左端点左边的点连边并且形成合法子树,\(R_{i,j}\)同理

这有点像树形DP中头顶的那条边

转移的时候,枚举子区间是否可以,然后看枚举的根是否可以连出去就可以了

事先预处理连边复杂度就是\(O(N^3)\)

事实上可以记搜+bitset卡过去的,区间DP上界本来就小,记搜再剪剪枝,几乎不可卡。


Code:

#include <cstdio>
#include <algorithm>
const int N=702;
int g[N][N],L[N][N],R[N][N],n,a[N];
int gcd(int x,int y){return y?gcd(y,x%y):x;}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",a+i);std::sort(a+1,a+1+n);for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++)g[i][j]=g[j][i]=gcd(a[i],a[j])!=1;g[i][0]=g[i][n+1]=1;}for(int i=1;i<=n;i++)L[i][i]=g[i][i-1],R[i][i]=g[i][i+1];for(int i=n;i;i--)for(int j=i+1;j<=n;j++)for(int k=i;k<=j;k++){if(k==i){L[i][j]|=g[k][i-1]&L[k+1][j];R[i][j]|=g[k][j+1]&L[k+1][j];}else if(k==j){L[i][j]|=g[k][i-1]&R[i][k-1];R[i][j]|=g[k][j+1]&R[i][k-1];}else{L[i][j]|=R[i][k-1]&L[k+1][j]&g[k][i-1];R[i][j]|=R[i][k-1]&L[k+1][j]&g[k][j+1];}}if(L[1][n]|R[1][n])puts("Yes");elseputs("No");return 0;
}

2018.10.12

转载于:https://www.cnblogs.com/butterflydew/p/9779249.html

CF1025D Recovering BST相关推荐

  1. 【CF1025D】Recovering BST

    题目 题意翻译 $$ 仓鼠 Dima\textsf{Dima}Dima 把一颗二叉排序树的所有边都吃掉了!!不仅如此,这棵树的所有顶点都被这只珂爱的仓鼠搞乱了. 不过他还是知道这棵树的一些性质--那就 ...

  2. Codeforces Round #505 D. Recovering BST(区间DP)

    首先膜一发网上的题解.大佬们tql. 给你n个单调递增的数字,问是否能够把这些数字重新构成一棵二叉搜索树(BST),且所有的父亲结点和叶子结点之间的gcd > 1? 这个题场上是想暴力试试的.结 ...

  3. Recovering BST CodeForces - 1025D (区间dp, gcd)

    大意: 给定$n$个数, 任意两个$gcd>1$的数间可以连边, 求是否能构造一棵BST. 数据范围比较大, 刚开始写的$O(n^3\omega(1e9))$竟然T了..优化到$O(n^3)$才 ...

  4. 2.25-3.2 周记

    2.25-3.2 1. 计算几何 1.1 二维几何基础 struct Point{double x,y;Point(double x = 0, double y = 0):x(x),y(y){} } ...

  5. LeetCode简单题之两数之和 IV - 输入 BST

    题目 给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 示例 1: 输入: root = [5,3,6,2,4,null, ...

  6. 将BST转换为有序的双向链表!

    在二叉树中,每个结点都有两个指向子结点的指针. 在双向链表中, 每个结点也有两个指针,它们分别指向前一个结点和后一个结点.由于这两种结构的相似性, 同时二叉搜索树也是一种排过序的数据结构, 因此在理论 ...

  7. [转载]二叉树(BST,AVT,RBT)

    二叉查找树(Binary Search Tree)是满足如下性质的二叉树:①若它的左子树非空,则左子树上所有结点的值均小于根结点的值:②若它的右子树非空,则右子树上所有结点的值均大于根结点的值:③左. ...

  8. 【每日一算法】两数之和 IV - 输入 BST

    微信改版,加星标不迷路! 每日一算法-两数之和IV-输入BST 作者:阿广 阅读目录 1 题目 2 解析 1 题目 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目 ...

  9. 数据结构之二叉搜索树(BST)

    数据结构之二叉搜索树(BST) 1. 二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: ( ...

最新文章

  1. CSS结构选择器四种结构关系的范围
  2. ESXi上的固态硬盘识别为非SSD
  3. TOMCAT启动完成但是ECLIPSE仍然显示starting....
  4. 赫胥黎的焦虑与美丽新世界
  5. 交换两个变量的值的效率的测试
  6. python 自动化框架_学会Python+Selenium,分分钟搭建Web自动化框架!
  7. Pair Programming (结对编程)
  8. 逆向微信-分析学习微信是如何快速构建静态TableView界面的
  9. 做一个管理者/技术负责人的学习之路--001
  10. arduino的pinMode()函数
  11. linux 在 vi 中设定一下行号 怎么做啊 求图片,linux中vi/vim显示行号设置
  12. h5 页面唤起微信和qq
  13. handsontable 给单元格设置下拉 菜单
  14. win10 1809版本手动安装WSL和ubuntu 18.04
  15. SAS9.4+sid更新
  16. 携程和12306解绑
  17. Arduino与Proteus仿真实例-LM75温度传感器驱动仿真
  18. Arduino 编译出错:Pixy2I2C.h: No such file or directory
  19. 绕过 word 文档的密码,对加密文档
  20. python学习日记

热门文章

  1. GIS十问之五:如何获得最靠谱的招聘信息?
  2. BrokerChain: A Cross-Shard Blockchain Protocol for Account/Balance-based State Sharding 阅读笔记
  3. Python异常「1」(异常的概念、异常捕获、异常的传递、自定义异常)
  4. react下将输入的汉字转化为拼音
  5. 仇保兴:哪些特色小镇,官方根本不认
  6. 记一次惊险的系统和分区修复
  7. java 发送激活邮件 以qq邮箱为例
  8. 关于传智书城QQ邮箱激活问题
  9. 在线电影平台成为主流之后,还将迎来三大变局
  10. vuejs中路由的传参以及路由props配置