zoukankan      html  css  js  c++  java
  • P3365 改造二叉树

    P3365 改造二叉树

    链接

    分析:

      求出中序遍历后,然后使其变成上升子序列。过程:每个点减去坐标,然后nlogn求出最长不下降子序列,n-ans即答案。

      做题时一直认为二叉树就是完全二叉树,然后一直MLE。。。

    代码:

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<cctype>
     7 
     8 using namespace std;
     9 
    10 const int N = 100100;
    11 
    12 int ls[N],rs[N],w[N],q[N],T[N],f[N];
    13 int tot;
    14 
    15 inline int read() {
    16     int x = 0,f = 1;char ch = getchar();
    17     for (; !isdigit(ch); ch=getchar()) if (ch=='-') f=-1;
    18     for (; isdigit(ch); ch=getchar()) x = x*10+ch-'0';
    19     return x * f;
    20 }
    21 void dfs(int u) {
    22     if (!u) return ;
    23 //    if (!ls[u] && !rs[u]) {q[++tot] = u;return; }
    24     dfs(ls[u]);
    25     q[++tot] = u;
    26     dfs(rs[u]);
    27 }
    28 
    29 int main() {
    30 
    31     int n = read();
    32     for (int i=1; i<=n; ++i) w[i] = read();
    33     for (int i=2; i<=n; ++i) {
    34         int faa = read(),p = read();
    35         if (p == 0) ls[faa] = i;
    36         else rs[faa] = i;
    37     }
    38     dfs(1);
    39     for (int i=1; i<=n; ++i) {
    40         T[i] = w[q[i]] - i;
    41     }
    42     int len = 1;
    43     f[1] = T[1];
    44     for (int i=2; i<=n; ++i) {
    45         if (T[i] >= f[len]) f[++len] = T[i];
    46         else {
    47             int pos = upper_bound(f+1,f+len+1,T[i]) - f;    
    48             f[pos] = min(f[pos],T[i]);
    49         }
    50     }
    51     cout << n - len;
    52     return 0;
    53 }
  • 相关阅读:
    定义模块与增加模块中的测试代码
    20150412自省
    Python中暂未解决的问题
    Node基础_文件系统
    Node基础_Buffer缓冲区
    Node基础_npm简介
    Node基础_模块化简介及详解
    Node基础_node简介
    Nosql_Mongoose简介及操作
    Nosql_MongoDB简单的查询练习
  • 原文地址:https://www.cnblogs.com/mjtcn/p/9130214.html
Copyright © 2011-2022 走看看