题目

郑州讲过的题了

发现这是一个二叉搜索树,给出的还是中序遍历,我们很自然的想到我们需要可以用一个\(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)\)就能完成枚举

之后如果能拼接成一棵新树,树根自然也就知道了,转移过去就好了

代码

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #define max(a,b) ((a)>(b)?(a):(b))
  6. #define min(a,b) ((a)<(b)?(a):(b))
  7. #define LL long long
  8. #define re register
  9. #define maxn 705
  10. inline int read() {
  11. char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
  12. while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
  13. }
  14. int gcd(int a,int b) {if(!b) return a;return gcd(b,a%b);}
  15. int n,a[maxn];
  16. int e[maxn][maxn];
  17. int f[maxn][maxn][2];
  18. int main() {
  19. n=read();
  20. for(re int i=1;i<=n;i++) a[i]=read();
  21. for(re int i=1;i<=n;i++)
  22. for(re int j=i+1;j<=n;j++)
  23. e[i][j]=e[j][i]=(gcd(a[i],a[j])!=1);
  24. for(re int i=1;i<=n;i++) {
  25. if(i>1&&e[i-1][i]) f[i][i][1]=1;
  26. if(i<n&&e[i][i+1]) f[i][i][0]=1;
  27. }
  28. for(re int p=1;p<n;p++) {
  29. for(re int i=1;i<=n;i++) {
  30. int j=i+p-1;
  31. if(f[i][j][1]) {
  32. for(re int k=1;k<=i-2;k++)
  33. if(f[k][i-2][0]) {
  34. if(e[k-1][i-1]) f[k][j][1]=1;
  35. if(e[j+1][i-1]) f[k][j][0]=1;
  36. }
  37. if(e[i-2][i-1]) f[i-1][j][1]=1;
  38. if(e[i-1][j+1]) f[i-1][j][0]=1;
  39. }
  40. if(f[i][j][0]) {
  41. for(re int k=j+2;k<=n;k++)
  42. if(f[j+2][k][1]) {
  43. if(e[j+1][k+1]) f[i][k][0]=1;
  44. if(e[j+1][i-1]) f[i][k][1]=1;
  45. }
  46. if(e[j+1][j+2]) f[i][j+1][0]=1;
  47. if(e[j+1][i-1]) f[i][j+1][1]=1;
  48. }
  49. }
  50. }
  51. f[1][0][0]=1;
  52. int flag=0;
  53. for(re int i=2;i<=n;i++)
  54. if(f[i][n][1]&&f[1][i-2][0]) flag=1;
  55. flag|=f[1][n-1][0];
  56. puts(flag?"Yes":"No");
  57. return 0;
  58. }

「CF1025D Recovering BST」的更多相关文章

  1. CF1025D Recovering BST

    题意:给定序列,问能否将其构成一颗BST,使得所有gcd(x, fa[x]) > 1 解:看起来是区间DP但是普通的f[l][r]表示不了根,f[l][r][root]又是n4的会超时,怎么办? ...

  2. 对于前端,「微信小程序」其实不美好

    微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...

  3. macOS安装「oh my zsh」

    目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』, ...

  4. 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!

    如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...

  5. 企业运营对 DevOps 的「傲慢与偏见」

    摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...

  6. 「前端开发者」如何把握住「微信小程序」这波红利?

    由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...

  7. 「花田对」CSDN程序员专场——谁来拯救技术宅!_豆瓣

    「花田对」CSDN程序员专场--谁来拯救技术宅!_豆瓣 「花田对」CSDN程序员专场--谁来拯救技术宅!

  8. Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.

    在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...

  9. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

随机推荐

  1. http协议的各类状态码

    http协议的状态码 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态码. 100(继续) 请求者应当继续提出请求.服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101( ...

  2. 一:Bootstrap-css样式

    页面大块布局: div.container 栅格系统: 一行分成 12 列 div.row div.col-md-12 div.col-xs-12 <div class="row&qu ...

  3. Eclipse 反编译之 JadClipse

    一:下载对应的 net.sf.jadclipse_x.x.x.jar ,把该jar包放入到Eclipse中的 plugins 目录下,下载地址:https://sourceforge.net/proj ...

  4. springcloud 实战 feign使用中遇到的相关问题

    springcloud 实战 feign使用中遇到的相关问题 1.使用feign客户端调用其他微服务时,session没有传递成功,sessionId不一样. /** * @author xbchen ...

  5. Ubuntu16.04 下安装tomcat

    有两种常用方法: 一.通过 apt-get 命令进行在线安装(会自动配置好环境变量和服务) 二.通过下载并解压 .tar.gz 包进行手动安装(需要手动配置环境变量) 一.通过 apt-get 命令进 ...

  6. web前端面试题(持续更新)

    此文是我本人在面试的时候遇到的问题和一些同学遇到的问题加资料上面的问题的总结.(将会持续更新,因为未有满意工作) 面试时有几点需要注意: 1.面试题目:根据你的等级和职位的变化,入门级到大神级,广度和 ...

  7. String和StringBuffer有什么区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  8. order by 多条件查询 case when

    场景:在按照条件查询后,排序按照不同的条件排序,以及同一个条件 正序和倒序排序.可以考虑使用. 遇到的排序条件:按照直播的状态,根据条件排序.直播的状态包括:直播.置顶.预告.回放.过期预告.排序条件 ...

  9. 使用button的open-type="getUserInfo"引导用户进行授权

    https://blog.csdn.net/weixin_39602178/article/details/80295684 一. 前言 小程序官方文档,上面说明 > wx.getUserInf ...

  10. Python 解决写入csv中间隔一行空行问题

    转载解决写入csv中间隔一行空行问题 写入csv: with open(birth_weight_file,'w') as f: writer=csv.writer(f) writer.writero ...