大意: 给定$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");
}

Recovering BST CodeForces - 1025D (区间dp, gcd)的更多相关文章

  1. CodeForces 512B(区间dp)

    D - Fox And Jumping Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64 ...

  2. Timetable CodeForces - 946D (区间dp)

    大意: n天, 每天m小时, 给定课程表, 每天的上课时间为第一个1到最后一个1, 一共可以逃k次课, 求最少上课时间. 每天显然是独立的, 对每天区间dp出逃$x$次课的最大减少时间, 再对$n$天 ...

  3. codeforces 1140D(区间dp/思维题)

    D. Minimum Triangulation time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. Codeforces 1114D(区间DP)

    题面 传送门 分析 法1(区间DP): 首先,我们可以把连续的相等区间缩成一个数,用unique来实现,不影响结果 {1,2,2,3,3,3,5,3,4}->{1,2,3,5,3,4} 先从一个 ...

  5. CodeForces - 1107E 区间DP

    和紫书上的Blocks UVA - 10559几乎是同一道题,只不过是得分计算不同 不过看了半天紫书上的题才会的,当时理解不够深刻啊 不过这是一道很好区间DP题 细节看代码 #include<c ...

  6. D. Recovering BST Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)

    http://codeforces.com/contest/1025/problem/D 树 dp 优化 f[x][y][0]=f[x][z][1] & f[z+1][y][0] ( gcd( ...

  7. CodeForces 149D 区间DP Coloring Brackets

    染色有三个条件: 对于每个点来说要么不染色,要么染红色,要么染蓝色 对于每对配对的括号来说,有且只有一个一边的括号被染色 相邻的括号不能染成相同的颜色 首先可以根据给出的括号序列计算出括号的配对情况, ...

  8. Zuma CodeForces - 607B (区间DP)

    大意: 给定字符串, 每次删除一个回文子串, 求最少多少次删完. #include <iostream> #include <cstdio> #define REP(i,a,n ...

  9. Codeforces 940 区间DP单调队列优化

    A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...

随机推荐

  1. 走进JavaWeb技术世界6:Tomcat5总体架构剖析

      本文以 Tomcat 5 为基础,也兼顾最新的 Tomcat 6 和 Tomcat 4.Tomcat 的基本设计思路和架构是具有一定连续性的. Tomcat 总体结构 Tomcat 的结构很复杂, ...

  2. Asis_2016_b00ks wp

    目录 程序基本信息 程序漏洞 利用思路 exp脚本 参考 程序基本信息 程序漏洞 有一个读入函数,程序的所有输入都靠它读取,这个程序有个很明显的off_by_one漏洞,在输入时多输入一个0字符. 利 ...

  3. javascript的正则表达式总结

    网上正则表达式的教程够多了,但由于javascript的历史比较悠久,也比较古老,因此有许多特性是不支持的.我们先从最简单地说起,文章所演示的正则基本都是perl方式. 元字符 ( [ { \ ^ $ ...

  4. WebSocketSharp中WebSocket类

    websocket-sharp.clone, Version=1.0.2.39869 WebSocket由方法调用事件改为实例化委托调用,两种构造 1.构造函数 第一种 // // 摘要: // In ...

  5. openstack instance change storage dir

    在云计算openstack中以为新建的虚拟机都存放在/var/lib/nova/instances中,在新建虚拟机时内存当然不够用,所以可以将nova转移到新的存储位置 以下操作只在计算节点上进行 一 ...

  6. Mac使用brew安装nginx,并解决端口80访问权限问题

    1.安装 brew install nginx 2.修改配置文件 sudo vi /usr/local/etc/nginx/nginx.conf 修改默认的8080端口为80 修改日志文件地方 err ...

  7. int 和String之间的相互转换

    int ---> String 1. 和 "" 进行拼接 2. 使用String类中的静态方法valueOf: public static String valueOf(in ...

  8. java获取两个日期之间的所有日期

    java获取两个日期之间的所有日期   解决方法: 1.核心方法 private List<String> getBetweenDates(String start, String end ...

  9. bat命令编写大全

    bat命令编写大全 摘自:https://blog.csdn.net/haibo19981/article/details/52161653 2016年08月09日 12:26:31 爱睡觉的猫L 阅 ...

  10. C++队列和链表

    1.什么是队列[queue] 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表. 关于队列 ...