首页 > 其他分享 >Max Mex

Max Mex

时间:2024-10-30 22:46:47浏览次数:1  
标签:GCC int Max optimize vec pragma inline Mex

Max Mex

和线段树维护直径集合一样的 trick。

思路

如果一条路径 \(a\) 包含 \([l,r]\) 权值中的所有点,另一条路径 \(b\) 包含和 \([x,y]\) 权值中的所有点构成的。

那么对于一条路径包含 \([l,r]\cup [x,y]\) 权值中的点,其端点一定在 \(a\) 和 \(b\) 的端点间出现。

其条件就是,有以 \(a,b\) 为端点的路径包含 \(a,b\) 的剩下的端点,可以通过 \(dfn\) 相邻的点的路径长度,和最长的端点间的路径长度来判断是否形成一条路径,具体实现看代码。

考虑用线段树维护区间内权值的点组成路径的端点,合并区间即可。

对于查询,在线段树上二分,如果左子树与之前求出的区间可以合并成一条链,向右子树搜索并合并区间;否则向左子树搜索,最后停下来的节点就是答案。

CODE

/*
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
*/
#include<bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define fi first
#define se second

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;
}
inline void write(int x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}

const int maxn=2e5+5;

int n,cok;
int dep[maxn],st[maxn][25],dfn[maxn],p[maxn],fp[maxn];

struct Edge
{
    int tot;
    int head[maxn];
    struct edgenode{int to,nxt;}edge[maxn];
    inline void add(int x,int y)
    {
        tot++;
        edge[tot].to=y;
        edge[tot].nxt=head[x];
        head[x]=tot;
    }
}T;

inline void dfs(int u,int f)
{
    dep[u]=dep[f]+1,dfn[u]=++cok;
    st[dfn[u]][0]=f;
    for(int i=T.head[u];i;i=T.edge[i].nxt)
    {
        int v=T.edge[i].to;
        dfs(v,u);
    }
}
inline int Min(int x,int y){return dep[x]<dep[y]?x:y;}
inline void init()
{
    for(int len=1;len<=log2(n);len++)
        for(int i=1;i<=n-(1<<len)+1;i++) st[i][len]=Min(st[i][len-1],st[i+(1<<(len-1))][len-1]);
}
inline int Lca(int x,int y)
{
    if(!(x^y)) return x;
    if(dfn[x]>dfn[y]) swap(x,y);
    int l=dfn[x]+1,r=dfn[y],k=log2(r-l+1);
    return Min(st[l][k],st[r-(1<<k)+1][k]);
}
inline int dis(int x,int y){return dep[x]+dep[y]-2*dep[Lca(x,y)];}

namespace linetree
{
#define lch(p) p<<1
#define rch(p) p<<1|1
    pii tr[maxn*8];
    inline bool cmp(int a,int b){return dfn[a]<dfn[b];}
    inline pii merge(pii a,pii b)
    {
        if(a.fi==0||b.fi==0||a.fi==-1||b.fi==-1) return {0,0};
        vector<int>vec;
        vec.push_back(a.fi),vec.push_back(a.se);
        vec.push_back(b.fi),vec.push_back(b.se);
        sort(vec.begin(),vec.end(),cmp);
        int sum=(dis(vec[0],vec[1])+dis(vec[1],vec[2])+dis(vec[2],vec[3])+dis(vec[3],vec[0]))/2;
        for(int i=0;i<4;i++)
        {
            for(int j=i+1;j<4;j++)
            {
                if(dis(vec[i],vec[j])==sum) return {vec[i],vec[j]};
            }
        }
        return {0,0};
    }
    inline void updata(int p){tr[p]=merge(tr[lch(p)],tr[rch(p)]);}
    inline void build(int p,int l,int r)
    {
        if(l==r) {tr[p]={fp[l],fp[l]};return ;}
        int mid=(l+r)>>1;
        build(lch(p),l,mid),build(rch(p),mid+1,r);
        updata(p);
    }
    inline void insert(int p,int l,int r,int pos,int val)
    {
        if(l==r)
        {
            tr[p]={val,val};
            return ;
        }
        int mid=(l+r)>>1;
        if(pos<=mid) insert(lch(p),l,mid,pos,val);
        else insert(rch(p),mid+1,r,pos,val);
        updata(p);
    }
    inline int qry(int p,int l,int r,pii tmp)
    {
        int mid=(l+r)>>1;
        if(l==r) return l+(merge(tmp,tr[p]).fi>0);
        pii res=merge(tr[lch(p)],tmp);
        if(tmp.fi==-1) res=tr[lch(p)];
        if(res.fi) return qry(rch(p),mid+1,r,res);
        return qry(lch(p),l,mid,tmp);
    }
#undef lch
#undef rch
}
using namespace linetree;

int main()
{
    n=read();
    for(int i=1;i<=n;i++) p[i]=read(),fp[p[i]]=i;
    for(int i=2,x;i<=n;i++) x=read(),T.add(x,i);
    dfs(1,0);
    init();
    linetree::build(1,0,n-1);
    int _;
    scanf("%d",&_);
    while(_--)
    {
        int op,x,y;
        // scanf("%d",&op);
        op=read();
        if(op==1)
        {
            // scanf("%d%d",&x,&y);
            x=read(),y=read();
            swap(fp[p[x]],fp[p[y]]);
            swap(p[x],p[y]);
            linetree::insert(1,0,n-1,p[x],x);
            linetree::insert(1,0,n-1,p[y],y);
        }
        else
        {
            write(linetree::qry(1,0,n-1,{-1,-1}));putchar('\n');
        }
    }
}

标签:GCC,int,Max,optimize,vec,pragma,inline,Mex
From: https://www.cnblogs.com/binbin200811/p/18516769

相关文章

  • Maxwell参数化建模和优化设计(下)
    本文摘要(由AI生成):本文主要介绍了ANSYSMaxwell优化设计工具的使用方法,包括温度参数化、外电路参数化、网格参数化、求解设置参数化等。同时,还介绍了ANSYSDesignXplorer和ANSYSoptiSLang两种优化工具的使用方法,以及如何进行响应面与Pareto图分析。最后,通过一个电机模型的优化......
  • 蛋白质组学搜库软件之 MaxQuant 介绍
    搜库过程是理论谱图和实际谱图的匹配过程本期继续介绍蛋白质组学搜库软件之MaxQuant1.参考文献TheMaxQuantcomputationalplatformformassspectrometry–basedshotgunproteomics(值得细细的阅读)2.推荐理由Freeandeasy3.简介MaxQuant是基于质谱(Ms)的蛋白质......
  • CF1249F Maximum Weight Subset 题解 / 长链剖分复习
    CF1249FMaximumWeightSubset题解题目大意给定一个\(n\)个节点的树,每个节点有点权\(a_i\)。从中选出若干节点,要求这些点两两之间距离大于给定常数\(k\),使得点权和最大。Solve给出一种线性做法。前置知识:长链剖分优化DP。考虑一个DP:设\(f(u,d)\)表示在\(u\)的子......
  • ESP32 使用 MAX98357 调用ESP-A2DP库播放蓝牙音乐
    ESP32-A2DP 库github链接:https://github.com/pschatzmann/ESP32-A2DP 硬件:ESP32+MAX989357+喇叭代码:(注意将其中的I2S引脚定义为自己的MAX98357相连接的引脚)最佳实践:在VSCode的PlatformIO的Library,查找ESP32-A2DP,然后将其安装进工程中。 #include"ESP_I2S.h"......
  • 5K价位Ultra 9 285K最佳座驾!ROG MAXIMUS Z890 HERO评测
    一、前言:供电规模提升50%一直以来,凭借着豪华的堆料以及独家的BIOS调校,败家之眼也就是ROG主板都是顶级酷睿处理器的不二之选。现在Intel新一代的桌面处理器酷睿Ultra200S正式解禁,而我们这就为大家带来ROGMAXIMUSZ890HERO主板的评测。前代ROGZ790HERO拥有21相90A供电电路,......
  • Maxwell 仿真磁芯损耗和绕组损耗的关键步骤
    本人常使用Maxwell仿真变压器和电感的损耗,将仿真注意事项记录在下,方便大家交流交流,欢迎各位指出错误之处。一、涡流场与瞬态场的区别涡流场与瞬态场的区别 涡流场瞬态场网格划分可自适应网格可自定义网格划分方式 必须自定义网格划分方式激励方式 ......
  • 【Python中的内置函数】max、map、zip等函数的实用技巧!
    Python中的内置函数:max、map、zip等函数的实用技巧Python提供了丰富的内置函数,帮助开发者高效编写简洁的代码。在这篇文章中,我们将详细探讨几个常用的内置函数,如max、map和zip,并展示如何在实际项目中灵活运用这些函数。本篇将结合代码示例,深入探讨它们的使用技巧,帮助你......
  • 其实在构建神经网络或训练神经网络的时候,还有另一个隐藏的前提假设,那就是当你选择sigm
    最大熵原理确实与选择激活函数(如sigmoid或softmax)有关。以下是一些相关的要点:最大熵原理:最大熵原理是一种统计推断的方法,旨在在已知信息的情况下,选择最不偏见的概率分布。换句话说,当我们对某个系统的知识有限时,选择熵最大的分布可以避免引入不必要的假设。激活函数与概率分......
  • 似然值最大的那个模型与目标最接近,这个前提假设和softmax选择以e为底这种做基本元素去
    似然值最大的模型与目标的接近性以及选择以e为底的指数函数构造Softmax函数之间有着密切的联系,主要体现在以下几个方面:1.似然函数与概率分布在统计建模中,最大似然估计(MLE)旨在寻找能够最优地解释观察数据的模型。通过最大化似然函数,我们实际上是在寻找一个概率分布,使得在给......
  • 线性基中的异或 min/max 研究
    引子:qoj1168。引子需要的前置知识:P4151。简要题意给定\(n\)个点\(m\)条边的无向联通图\(G\),边有边权。其中\((u,v)\)的距离\(d(u,v)\)定义为\(u\tov\)的最大\(\text{xor}\)路径。\(q\)次询问\(l,r\),求\(\bigoplus\limits_{l\lei<j\ler}d(i,j)\)的值。\(1......