「CF1025D Recovering BST」
郑州讲过的题了
发现这是一个二叉搜索树,给出的还是中序遍历,我们很自然的想到我们需要可以用一个\(f[i][j][k](k\in[i,j])\)来表示区间\([i,j]\)能不能形成以\(k\)为根的二叉搜索树
就是区间的\(dp\)的套路我们还需要枚举一下树根,复杂度高达\(O(n^5)\)
很不可行啊
换一个思路,我们用\(f[i][j][0/1]\)表示区间\([i,j]\)能否形成一棵左子树/右子树
如果形成的是左子树,自然树根是\(j+1\),如果是右子树,根自然是\(i-1\)
于是我们枚举区间\([i,j]\),枚举和\([i,j]\)形成一棵树的另一个区间,由于这个区间已经确定了左端点或者右端点,我们\(O(n^3)\)就能完成枚举
之后如果能拼接成一棵新树,树根自然也就知道了,转移过去就好了
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define LL long long
#define re register
#define maxn 705
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int gcd(int a,int b) {if(!b) return a;return gcd(b,a%b);}
int n,a[maxn];
int e[maxn][maxn];
int f[maxn][maxn][2];
int main() {
n=read();
for(re int i=1;i<=n;i++) a[i]=read();
for(re int i=1;i<=n;i++)
for(re int j=i+1;j<=n;j++)
e[i][j]=e[j][i]=(gcd(a[i],a[j])!=1);
for(re int i=1;i<=n;i++) {
if(i>1&&e[i-1][i]) f[i][i][1]=1;
if(i<n&&e[i][i+1]) f[i][i][0]=1;
}
for(re int p=1;p<n;p++) {
for(re int i=1;i<=n;i++) {
int j=i+p-1;
if(f[i][j][1]) {
for(re int k=1;k<=i-2;k++)
if(f[k][i-2][0]) {
if(e[k-1][i-1]) f[k][j][1]=1;
if(e[j+1][i-1]) f[k][j][0]=1;
}
if(e[i-2][i-1]) f[i-1][j][1]=1;
if(e[i-1][j+1]) f[i-1][j][0]=1;
}
if(f[i][j][0]) {
for(re int k=j+2;k<=n;k++)
if(f[j+2][k][1]) {
if(e[j+1][k+1]) f[i][k][0]=1;
if(e[j+1][i-1]) f[i][k][1]=1;
}
if(e[j+1][j+2]) f[i][j+1][0]=1;
if(e[j+1][i-1]) f[i][j+1][1]=1;
}
}
}
f[1][0][0]=1;
int flag=0;
for(re int i=2;i<=n;i++)
if(f[i][n][1]&&f[1][i-2][0]) flag=1;
flag|=f[1][n-1][0];
puts(flag?"Yes":"No");
return 0;
}
「CF1025D Recovering BST」的更多相关文章
- CF1025D Recovering BST
题意:给定序列,问能否将其构成一颗BST,使得所有gcd(x, fa[x]) > 1 解:看起来是区间DP但是普通的f[l][r]表示不了根,f[l][r][root]又是n4的会超时,怎么办? ...
- 对于前端,「微信小程序」其实不美好
微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...
- macOS安装「oh my zsh」
目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』, ...
- 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!
如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...
- 企业运营对 DevOps 的「傲慢与偏见」
摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...
- 「前端开发者」如何把握住「微信小程序」这波红利?
由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...
- 「花田对」CSDN程序员专场——谁来拯救技术宅!_豆瓣
「花田对」CSDN程序员专场--谁来拯救技术宅!_豆瓣 「花田对」CSDN程序员专场--谁来拯救技术宅!
- Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.
在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...
- LOJ6003 - 「网络流 24 题」魔术球
原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...
随机推荐
- java 基础 --- java8 HashMap
问题 : HashMap 容量大小 (capacity)为什么为 2n HashMap 是线程安全的吗,为什么 HashMap 既然有hash进行排位还需要equals()作用是什么 文章部分图片 ...
- xsl 和xml transform方法的调用
xsl 和xml生成html,兼容多个浏览器 <html> <head> <meta charset="UTF-8"/> </head&g ...
- Echarts 有点难度的柱状图
本次的难点在于交叉传数据,又要把四组20个不同日期 显示上! 先看效果图: 数据传递方式:图 function func_echarts_2ba() { var echarts_2bar = echa ...
- 程序员必备技能:代码审查 (Google牛人谈Code Review)
在上一篇博客里我暗示自己将不在为Google工作. 我还没有决定好去哪儿-有几个非常不错的工作机会让我选择.鉴于这段时间内我不受雇于任何公司,我想我可以写点和专业相关的东西,这些东西很有趣,但是如果我 ...
- 撩课-Java每天5道面试题第21天
136.请解释Spring Bean的生命周期? 首先说一下Servlet的生命周期: 实例化, 初始init, 接收请求service, 销毁destroy: Spring上下文中的Bean生命周期 ...
- shell文本操作
一.find查找命令的使用 1.find . -name "*.txt" 在当前目录下,查找以txt结尾的文件 2.find . -name "[a-z]" 在 ...
- java设计模式-----7、装饰模式
首先,什么是装饰者模式呢??? 装饰( Decorator )模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案.他是23种设计模式之一,英文叫Decorator ...
- CF891E Lust
传送门 题目大意 你有 \(n\) 个数 \(a_1,a_2...a_n\) 要进行 \(k\) 次操作 每次随机选择一个数 \(x\),使得答案加上 \(\prod_{i \neq x}a_i\) ...
- JS实现省市联动效果
实现的效果为:当选择一个省的时候,会自动出现该省下的市级 效果图如下: <body> <div> <!--界面展示--> <span>省份:</s ...
- jQuery轮播图(一)轮播实现并封装
利用面向对象自己动手写了一个封装好的jquery轮播组件,可满足一般需求,不仅使用简单且复用性高. demo:点此预览 代码地址:https://github.com/zsqosos/componen ...