大意: 给定$n$个数, 任意两个$gcd>1$的数间可以连边, 求是否能构造一棵BST.

数据范围比较大, 刚开始写的$O(n^3\omega(1e9))$竟然T了..优化到$O(n^3)$才过.

思路就是先排个序, 记$L[i][j]$表示区间$[i,j]$是否能组成以$i-1$为根的$BST$, $R[i][j]$为区间$[i,j]$能否组成以$j+1$为根的BST. 然后暴力转移即可.

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#define pb push_back
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;const int N = 750;
int n, a[N], g[N][N];
vector<int> fac[N];
int L[N][N], R[N][N], c[N][N];vector<int> calc(int x) {vector<int> v;for (int i=2; i*i<=x; ++i) if (x%i==0) {v.pb(i);while (x%i==0) x/=i;}if (x>1) v.pb(x);return v;
}int main() {scanf("%d", &n);REP(i,1,n) scanf("%d", a+i);sort(a+1,a+1+n);REP(i,1,n) { fac[i] = calc(a[i]);a[i] = 1;for (int j:fac[i]) a[i] *= j;}REP(i,1,n) REP(j,i+1,n) {for (int t:fac[i]) {if (a[j]%t==0) c[i][j]=c[j][i]=1;}}REP(d,1,n) for (int l=1,r=l+d-1;r<=n;++l,++r) {if (d==1) {L[l][r] = c[l-1][l];R[l][r] = c[l+1][l];continue;}if (L[l+1][r]) {if (d==n) return puts("Yes"),0;if (l!=1&&!L[l][r]) L[l][r]=c[l-1][l];if (r!=n&&!R[l][r]) R[l][r]=c[r+1][l];}if (R[l][r-1]) {if (d==n) return puts("Yes"),0;if (l!=1&&!L[l][r]) L[l][r]=c[l-1][r];if (r!=n&&!R[l][r]) R[l][r]=c[r+1][r];}REP(k,l+1,r-1) {if (R[l][k-1]&&L[k+1][r]) {if (d==n) return puts("Yes"),0;if (l!=1&&!L[l][r]) L[l][r]=c[l-1][k];if (r!=n&&!R[l][r]) R[l][r]=c[r+1][k];}}}puts("No");
}

转载于:https://www.cnblogs.com/uid001/p/11129698.html

Recovering BST CodeForces - 1025D (区间dp, gcd)相关推荐

  1. CodeForces - 1312E Array Shrinking(区间dp)(通俗易懂)

    CodeForces - 1312E Array Shrinking(区间dp) 题目链接: 没做出来,看了一下别人的题解,才A掉.但网上没发现一篇讲得比较易懂的题解,所以就准备写一篇再加上我自己的理 ...

  2. Codeforces 508E Arthur and Brackets 区间dp

    Arthur and Brackets 区间dp, dp[ i ][ j ]表示第 i 个括号到第 j 个括号之间的所有括号能不能形成一个合法方案. 然后dp就完事了. #include<bit ...

  3. CodeForces - 1312E Array Shrinking(区间dp)

    题目链接:点击查看 题目大意:给出 n 个数,现在可执行的操作是: 找到相邻且数值相等的两个数,即 abs( i - j ) == 1 && a[ i ] == a[ j ] 使得两个 ...

  4. Codeforces Round #655 (Div. 2) E. Omkar and Last Floor 区间dp + 巧妙的状态设计

    传送门 题意: 思路: 按照贪心的思路来考虑的话,显然是每一列111的个数越多越好,所以我们能放到一列就放到一列.设f[l][r]f[l][r]f[l][r]为在[l,r][l,r][l,r]内,区间 ...

  5. 【CodeForces - 245H 】Queries for Number of Palindromes (带容斥的区间dp)

    题干: You've got a string s = s1s2... s|s| of length |s|, consisting of lowercase English letters. The ...

  6. Codeforces Gym100543L Outer space invaders 区间dp 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100543L.html 题目传送门 - CF-Gym100543L 题意 $T$ 组数据. 有 $n ...

  7. Codeforces Gym100543L:Outer space invaders(区间DP)

    题目链接 题意 有n个人,每个人有一个出现时间a和一个开枪时间b和一个距离d,在任意一个时刻,你可以选择炸人,你要炸一个人的花费是和他的距离d,并且所有的已经出现并且还没开枪的和你距离<=d的人 ...

  8. CF1025D Recovering BST

    CF1025D Recovering BST 题目描述 Dima the hamster enjoys nibbling different things: cages, sticks, bad pr ...

  9. SDU_week16_CSP模测(T4区间dp)

    目录 T1 数鸭子 题目描述 题目分析 长长记性 代码 T2 ZJM要抵御宇宙射线 题目描述 题目分析 长长记性 代码 T4 宇宙狗的危机(区间dp) 题目描述 题目分析 代码 T1 数鸭子 题目描述 ...

最新文章

  1. MariaDB Galera Cluster环境搭建及高可用测试
  2. python和什么一起学_[lvog1]和小菜一起学python(零基础开始学习)
  3. 【TensorFlow官方文档】MNIST机器学习入门
  4. 【英语学习】【WOTD】disparage 释义/词源/示例
  5. php中使用websocket
  6. ElasticSearch Client详解
  7. jstack查看某个进程堆栈信息
  8. java数据类型单位_java的数据类型
  9. 【2021牛客暑期多校训练营7】xay loves trees(dfs序,维护根出发的链)
  10. 浅析智慧照明,实现建筑节能
  11. 金蝶盘点机PDA仓库条码管理:仓库如何盘点
  12. 研旭至尊板——F28335知识点总结①
  13. flex 3 格式化组件
  14. UE4编辑器ToolBar扩展
  15. 遇到slideUp Down 问题
  16. LeetCode第一题——曼哈顿距离
  17. 项目中的用户鉴权是如何实现的?
  18. Python参考题库1234
  19. 基于知识图谱和推荐系统的统一药物靶点相互作用预测框架
  20. android安装教程!深入理解Flutter动画原理,大厂面试题汇总

热门文章

  1. Swift教程之基本操作符
  2. 您知道您客户的数据价值几何吗?
  3. AMD第七代桌面APU揭秘:主流首次上DDR4
  4. 在VB.NET中初始化网格实现方法知识讲解
  5. Android2.2 API 中文文档
  6. python多继承_Python多继承,__init__
  7. python 统计英文词频
  8. 中国银行业协会首席信息官高峰:银行函证区块链服务平台具备六大优势
  9. SAP License:SE16N
  10. SAP License:关于工作我的一些体会