首页 > 其他分享 >CF1740H MEX Tree Manipulation

CF1740H MEX Tree Manipulation

时间:2022-11-16 09:57:38浏览次数:64  
标签:p2 p1 int Tree w2 w1 CF1740H MEX define

题面传送门

首先肯定要先离线下来把树建好然后一个一个点加进去。

先来考虑单个点答案的上届,设\(g_i\)表示mex为\(i\)的点子树内至少几个点,容易发现是\(g_i=2^i\),那么单个点的答案就是\(O(\log n)\)的。然后你还可以进一步推出来整棵树的答案是\(O(n)\)级别的但是没有什么用。

考虑轻重链剖分以后ddp,每个点维护一个函数表示\(f(x)\)表示重儿子的权值是\(x\)的情况下当前点的权值是什么以及权值和是多少,容易发现我们要做的其实就是对一条重链上的函数进行复合,也即求\(f_1(f_2(f_3(\dots)))\)。

因为这个函数值域是\(O(\log n)\)的所以可以直接暴力修改,暴力复合,这样的话复杂度是\(O(n\log^3n)\)的。也许能过。

但是你会发现这个函数具有特殊性质,具体的,除了一个点取到特殊值以外,其它都是常值函数,也就是说可以\(O(1)\)复合,实现一个struct即可做到\(O(n\log ^2n)\)

code:

#include<bits/stdc++.h>
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define R(n) (rnd()%(n))
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned ll;
using namespace std;const int N=3e5+5,M=N*4+5,K=(1<<10)+5,mod=998244353,Mod=mod-1;ll INF=1e18+7;const db eps=1e-5;mt19937 rnd(time(0));
int n,m,k,x,y,z,fa[N],Ans[N],d[N],Si[N],Sn[N],Id[N],Tp[N],Ih,Fl[N][20],En[N];vector<int> S[N];
struct Node{int p1,p,p2,w1,w2;Node operator +(const Node &B)const{Node C;C.w1=w1;C.w2=w2;C.p=p;p1^B.p?(C.p1=B.p1,C.w1+=B.w1):(C.p1=B.p2,C.w1+=B.w2);p2^B.p?(C.p2=B.p1,C.w2+=B.w1):(C.p2=B.p2,C.w2+=B.w2);return C;}};
namespace Tree{
	#define ls v<<1
	#define rs v<<1|1
	Node f[M];void Up(int v){f[v]=f[rs]+f[ls];}void Ins(int x,Node y,int l=1,int r=n,int v=1){if(l==r) {f[v]=y;return;}int m=l+r>>1;x<=m?Ins(x,y,l,m,ls):Ins(x,y,m+1,r,rs);Up(v);}
	Node Qry(int x,int y,int l=1,int r=n,int v=1){if(x<=l&&r<=y) return f[v];int m=l+r>>1;if(y<=m) return Qry(x,y,l,m,ls);if(x>m)return Qry(x,y,m+1,r,rs);return Qry(x,y,m+1,r,rs)+Qry(x,y,l,m,ls);}
	#undef ls
	#undef rs
}
void dfs1(int x,int La){d[x]=d[La]+1;Si[x]=1;for(int i:S[x]) i^La&&(dfs1(i,x),Si[x]+=Si[i],Si[i]>Si[Sn[x]]&&(Sn[x]=i));}
void dfs2(int x,int La){Tp[x]=La;Id[x]=++Ih;if(!Sn[x]) return;dfs2(Sn[x],La);for(int i:S[x]) i^fa[x]&&i^Sn[x]&&(dfs2(i,i),0);}
Node Find(int x){Node C;C.p1=0;while(Fl[x][C.p1]) C.p1++;C.p=C.p1;C.p2=C.p1+1;while(Fl[x][C.p2]) C.p2++;C.w1=C.p1;C.w2=C.p2;return C;}
int main(){
	freopen("1.in","r",stdin);
	int i,j;scanf("%d",&n);n++;for(i=2;i<=n;i++) scanf("%d",&fa[i]),S[fa[i]].PB(i);dfs1(1,0);dfs2(1,1);Tree::Ins(Id[1],Find(1));En[1]=1;
	for(i=2;i<=n;i++){Ans[i]=Ans[i-1];
		x=fa[i];while(x){Node p=Tree::Qry(Id[Tp[x]],En[Tp[x]]);Ans[i]-=p.w1;(x=fa[Tp[x]])&&(Fl[x][p.p1]--);}En[Tp[i]]=Id[i];Tree::Ins(Id[i],Find(i));
		x=i;while(x){Node p=Tree::Qry(Id[Tp[x]],En[Tp[x]]);Ans[i]+=p.w1;(x=fa[Tp[x]])&&(Fl[x][p.p1]++,Tree::Ins(Id[x],Find(x)),0);}printf("%d\n",Ans[i]); 
	}
}

标签:p2,p1,int,Tree,w2,w1,CF1740H,MEX,define
From: https://www.cnblogs.com/275307894a/p/16894826.html

相关文章

  • Vue项目中使用树形控件 vue-table-width-tree-grid
    Vue项目中使用树形控件vue-table-width-tree-grid需要实现的整体效果如下:这个树形结构组件ElementUI是没有提供的,我们需要依赖第三方插件来完成。一、安装tree-ta......
  • 【题解】[模拟赛20221115] Tree
    模拟赛20221115Tree|CQNK\(O(m*n*2^n)\)很好做,但是本题有更优秀的做法:在此记录复杂度\(O(n*2^n)\)的做法。考虑从后往前dp,设dp状态\(f_{s,0/1}\)分别表示在填......
  • tree 动态添加、删除树结构数据
    tree.vue组件<template><div><div@click="getData":style="getDetph(currentItem.level)"class="li"><spanclass="icon"></span>......
  • CF1083C Max Mex
    题意给定一棵树,点权为\(0\simn-1\)的排列。每次交换两个点的点权或者询问整棵树上所有路径中,路径上点权的\(\operatorname{mex}\)最大值。Solution比较神奇的转化......
  • Minimum Number of Operations to Sort a Binary Tree by Level
    MinimumNumberofOperationstoSortaBinaryTreebyLevelYouaregiventhe root ofabinarytreewithuniquevalues.Inoneoperation,youcanchooseany......
  • [已满分在线评测] cmu15445 2022 PROJECT #2 B+Tree Index
    CMU154452022PROJECT#2B+TreeIndex前前言本地测试通过是真的比较简单,因为有数据可以单步debug,很快就能定位错误。但是要通过在线评测还是比较痛苦的,没有数据,没办法......
  • Educational Codeforces Round 35 (Rated for Div. 2) F. Tree Destruction(树的直径/
    题目大意是给定一棵树,每次选择两个叶子将其删除,同时将两个叶子之间的简单路径长度加到答案上,找到一种方案使答案最大化,并输出删除的顺序。首先有一个结论是,距离树上某个节......
  • [15-445]B+Tree memo
    B树是一个家族,感觉B+Tree对于喜欢使用MySQL的我来说是最常听说的数据库索引结构之一了。但是我从来没有从头到尾自己实现过一个B+Tree,像类似的数据结构,感觉不真正自......
  • TreeMap底层
    publicclassTreeMap<K,V>{//重要属性//外部比较器privatefinalComparator<?superK>comparator;//树的根节点privatetransientEntr......
  • vue2项目中使用 vue2-org-tree组件实现组织架构图
    1.安装及使用操作流程npm安装:npmivue2-org-tree安装loader,不然会报错npminstall--save-devlessless-loadermain.js文件引入并使用:importVue2OrgTreefrom'vue......