首页 > 其他分享 >CF1528C Trees of Tranquillity

CF1528C Trees of Tranquillity

时间:2024-08-14 19:05:03浏览次数:3  
标签:insert include CF1528C idx int Trees Tranquillity now define

小清新找性质题,想到关键就很简单

考虑在第一棵树上枚举一条从 \(1\) 到某个点的链,显然这些点之间满足第一个限制,现在只要在这些点中选出尽可能多的点满足第二个限制即可

在第二棵树上两个点没有祖先关系,等价于它们对应的 DFS 序区间相离

而两个点的 DFS 序区间显然要么相离要么包含,在出现包含的情况时舍去大的那个即可

set 维护区间,复杂度 \(O(n\log n)\)

#include<cstdio>
#include<iostream>
#include<set>
#include<vector>
#define RI register int
#define CI const int&
#define fi first
#define se second
using namespace std;
typedef pair <int,int> pi;
const int N=300005;
int t,n,x,ans,idx,L[N],R[N]; vector <int> A[N],B[N]; set <pi> s;
inline void DFS1(CI now=1)
{
    L[now]=++idx; for (auto to:B[now]) DFS1(to); R[now]=idx;
}
inline void DFS2(CI now=1)
{
    bool is_insert=0,is_delete=0; pi tmp;
    auto it=s.lower_bound({L[now],0});
    if (it!=s.end()&&it->se<R[now])
    {
        // don't insert this interval
    } else
    {
        if (it!=s.begin())
        {
            --it;
            if (it->fi<=L[now]&&R[now]<=it->se)
            {
                is_delete=1; tmp=*it;
                s.erase(it);
            }
        }
        is_insert=1; s.insert({L[now],R[now]});
    }
    ans=max(ans,(int)s.size());
    for (auto to:A[now]) DFS2(to);
    if (is_insert) s.erase({L[now],R[now]});
    if (is_delete) s.insert(tmp);
}
int main()
{
    for (scanf("%d",&t);t;--t)
    {
        scanf("%d",&n); ans=idx=0; s.clear();
        for (RI i=1;i<=n;++i) A[i].clear(),B[i].clear();
        for (RI i=2;i<=n;++i) scanf("%d",&x),A[x].push_back(i);
        for (RI i=2;i<=n;++i) scanf("%d",&x),B[x].push_back(i);
        DFS1(); DFS2(); printf("%d\n",ans);
    }
    return 0;
}

标签:insert,include,CF1528C,idx,int,Trees,Tranquillity,now,define
From: https://www.cnblogs.com/cjjsb/p/18359606

相关文章

  • BINARY-SEARCH-TREES(二叉搜索树)
        一颗二叉搜索树是以一颗二叉树来组织的。除了数据之外,每个结点还包含属性left,right和p,它们分别指向结点的左孩子,右孩子和双亲。如果某个孩子结点和父结点不存在,则相应属性值为NULL。根结点是树中唯一父指针为NULL的结点。    二叉搜索树对任何结点x,其左子......
  • Java集合:Collection and Map;ArrayList;LinkList;HashSet;TreeSet;HashMap;TreeMap;Iterator:
        集合介绍:                        是一组变量类型(容器),跟数组很像。一,引用集合的原因(必要性):                  A:数组的空间长度固定,一旦确定不可以更改。多了浪费,少了报错。          B:使用数......
  • Luogu P10842 Piggy and Trees 题解 [ 绿 ] [ 拆边 ] [ 贡献思维 ]
    PiggyandTrees:把路径拆成边的思维题。思路一看到这题的路径,就想到了LuoguP3177树上染色这题化路径为边的贡献,分别计算的思维。那么对于此题,先来观察题目里式子的意思:对于树上的每个无序点对,求出树上每个点到这些点对之间的最短路径的距离之和。枚举点对对应的就是前两......
  • 13-TreeSet和TreeMap基本介绍
    13-TreeSet和TreeMap基本介绍介绍汇总:TreeSet基本介绍TreeMap基本介绍1-TreeSet基本介绍TreeSet类用于存储一组对象,并将对象按照自然规则(实现Comparator接口的)或者指定Comparator对象的比较器进行排序。TreeSet类中的底层是TreeMap。key值不可以为null,也不......
  • Leetcode 3203. Find Minimum Diameter After Merging Two Trees
    Leetcode3203.FindMinimumDiameterAfterMergingTwoTrees1.解题思路2.代码实现题目链接:3203.FindMinimumDiameterAfterMergingTwoTrees1.解题思路这一题的话算是一个拓扑树的题目?总之就是从树的叶子节点不断向上遍历,不断地删除已访问的叶子节点,并加入......
  • 梳理TreeSet
    具有对所存储元素进行排序在TreeSet集合中存储,String,Integer,Double这三个类都去实现了一个comparable接口jdk提供了一种包装类都默认实现了java,lang.comparable接口(自带自然排序)在TreeSet集合中存储,自定义类型//程序员自己定义的就必须保证自定义类型,有实现java,lan......
  • TreeSet排序规则
    自然排序Comparable的使用使用空参构造方法创建TreeSet集合自定义的Student类实现Comparable接口,接口对他实现的每一个类创建了一个接口packagealgorithm.set;importjava.util.HashSet;/***@authorxiaowang*@creat2024/6/723:05*@DescriptionJavaLotus......
  • LeetCode 1305. All Elements in Two Binary Search Trees
    原题链接在这里:https://leetcode.com/problems/all-elements-in-two-binary-search-trees/description/题目:Giventwobinarysearchtrees root1 and root2,return alistcontainingalltheintegersfrombothtreessortedin ascending order.Example1:Input:......
  • .NET 中的表达式树(Expression Trees)
    .NET中的表达式树 .NET中的表达式树(ExpressionTrees)表达式树是什么?表达式树(ExpressionTrees)是.NET框架中的一个强大功能,它将代码表示为一个由表达式节点组成的树形结构。每个节点代表代码中的一个操作,例如方法调用、算术运算、逻辑运算等。表达式树允许开发者在运行时......
  • 96-Unique Binary Search Trees 二叉搜索树的数量
    问题描述链接:https://leetcode.com/problems/unique-binary-search-trees/description/Givenaninteger n,return thenumberofstructurallyunique BST's(binarysearchtrees)whichhasexactly n nodesofuniquevaluesfrom 1 to n.解释:给定一个整数n,求1~n......