2019牛客暑期多校训练营(第一场),A题(笛卡尔树)

题意转换过来之后大概就是建立两个数组a[n].b[n]的笛卡尔树,并求出这两棵笛卡尔树从key=1开始能够同构的最大子树。
代码如下:

#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1e5+5;
int a[maxn],b[maxn],n;
int f1[maxn],l1[maxn],r1[maxn],root1;
int f2[maxn],l2[maxn],r2[maxn],root2;
 
int build(int *arr,int *f,int *l,int *r)
{
    for(int i=1;i<=n;++i)    f[i]=l[i]=r[i]=0;
    stack st;
    int rt,last;
    for(int i=1;i<=n;++i)
    {
        last=0;
        while(!st.empty())
        {
            if(arr[st.top()]

TIPS:根据笛卡尔树及题目的性质,灵活的找到同构的条件

你可能感兴趣的:(数据结构)