首页 > 其他分享 >[ARC183E] Ascendant Descendant

[ARC183E] Ascendant Descendant

时间:2024-08-27 09:38:58浏览次数:8  
标签:ARC183E int LCA mid 250010 mathcal Ascendant Descendant

My Blogs

[ARC183E] Ascendant Descendant

一个直接的想法是求出 \(L_i,R_i\) 表示极大的区间 \([L_i,R_i]\) 满足 \(\forall j\in[L_i,R_i],b_j\in \text{subtree}(a_i)\)。由于树的性质,\([L_i,R_i]\) 之间要么相离,要么包含。

但是 \(L_i,R_i\) 并不是 \(i\) 能真正到达的点。因为 \(i\) 只能一个一个交换过去,中途可能会有一些点阻碍着 \(i\) 的交换。具体的,把 \([L_i,R_i]\) 构成的树形结构建出来,会阻碍交换的点就是满足 \(siz_i=R_i-L_i+1\) 的整棵子树。必要性和充分性都比较显然。(但是想不到啊)

求 \([L_i,R_i]\) 是平凡的,一个 \(\mathcal O(1)\) LCA 和线段树或者 ST 表就能在 \(\mathcal O(m\log m)\) 的时间里求出来。后半部分实现的时候可以按照区间长度排序,拿一个 BIT 维护区间和,每次是区间内任选一个点单点加一即可。再用一个 'set' 维护删掉的点。总复杂度 \(\mathcal O(n\log n)\)。

int n,m,L,R,mid,tot,fr[250010],a[250010],l[250010],r[250010];
int F[18][250010],G[18][250010],dfn[250010];
vi T[250010];
tup c[250010];
inline int get(int x,int y){return dfn[x]<dfn[y]?x:y;}
inline bool cmp(tup x,tup y){return (x.y-x.x)<(y.y-y.x)||((x.y-x.x)==(y.y-y.x)&&a[x.z]<a[y.z]);}
void dfs(int x,int fa=0){F[0][dfn[x]=++tot]=fa;for(auto to:T[x])dfs(to,x);}
inline int LCA(int x,int y)
{
	if(x==y)return x;
	if((x=dfn[x])>(y=dfn[y]))swap(x,y);
	int k=__lg(y-x++);
	return get(F[k][x],F[k][y-(1<<k)+1]);
}
inline int ask(int l,int r){int k=__lg(r-l+1);return LCA(G[k][l],G[k][r-(1<<k)+1]);}
namespace BIT
{
	int t[250010];
	inline void add(int x){for(;x<=m;x+=x&-x)++t[x];}
	inline int ask(int x){int s=0;for(;x;x-=x&-x)s+=t[x];return s;}
}
using namespace BIT;
set<int> st;
map<pii,int> hash;
inline void mian()
{
	read(n,m),fr[0]=1;int x,ans=1;
	for(int i=1;i<=m;++i)fr[i]=Cmul(fr[i-1],i);
	for(int i=2;i<=n;++i)read(x),T[x].eb(i);
	dfs(1);
	for(int i=1;i<18;++i)for(int j=1;j+(1<<i)-1<=n;++j)
	F[i][j]=get(F[i-1][j],F[i-1][j+(1<<(i-1))]);
	for(int i=1;i<=m;++i)read(a[i]);
	for(int i=1;i<=m;++i)read(G[0][i]);
	for(int i=1;i<18;++i)for(int j=1;j+(1<<i)-1<=m;++j)
	G[i][j]=LCA(G[i-1][j],G[i-1][j+(1<<(i-1))]);
	for(int i=1;i<=m;++i)
	{
		L=1,R=i;
		while(L<R)
		{
			mid=L+((R-L)>>1); 
			if(LCA(ask(mid,i),a[i])==a[i])R=mid;
			else L=mid+1;
		}
		c[i].x=L,L=i,R=m;
		while(L<R)
		{
			mid=L+((R-L+1)>>1);
			if(LCA(ask(i,mid),a[i])==a[i])L=mid;
			else R=mid-1;
		}
		c[i].y=L,c[i].z=i;
	}
	sort(c+1,c+1+m,cmp),st.insert(0),st.insert(m+1);
	for(int i=1;i<=m;++i)
	{
		int xx=c[i].x,yy=c[i].y;
		Mmax(c[i].x,(*(--st.lower_bound(c[i].z)))+1);
		Mmin(c[i].y,(*st.lower_bound(c[i].z))-1);
		int v=c[i].y-c[i].x+1-(ask(c[i].y)-ask(c[i].x-1));
		Mmul(ans,v),add(c[i].z);
		hash[mp(c[i].x*m+c[i].y,a[c[i].z])]++;
		if(ask(yy)-ask(xx-1)==yy-xx+1)st.insert(xx),st.insert(yy);
	}
	for(auto [x,y]:hash)Mmul(ans,power(fr[y],MOD-2));
	write(ans);
}

标签:ARC183E,int,LCA,mid,250010,mathcal,Ascendant,Descendant
From: https://www.cnblogs.com/WrongAnswer90/p/18382019

相关文章

  • E - Count Descendants
    他问题本质是问u子树内绝对深度为d的节点个数。它是时间戳手法的一个拓展或者细化。在时间戳数组上。有个性质:......
  • ABC202E Count Descendants
    ABC202ECountDescendants线段树合并模板题。每次询问就是给定有序数对\((u,d)\),求有根树\(T\)上,点\(u\)的子树内有多少点\(v\),使得\(v\)的深度恰好等于\(d+1\)。定义根节点深度为\(1\)。考虑对每一个点开一个长度为\(n\)(因为\(T\)的最大深度为\(n\))的数组......
  • vb.net Linq XML Xdocument Descendants 为空
    在使用xdocumentdesendants进行筛选元素时,发现结果为空 经过网友的文章提醒发现是命名空间的问题在使用linqwhere进行网页元素筛选时发现descendants("div")不起作用,而是用descendatns可以看到元素枚举DimieAsIEnumerable(OfXElement)=ex1.Descendant......
  • Ant Design Pro项目一初始化就报a标签嵌套a标签错误<a> cannot as a descendant of <a
    前情公司经常需要做一些后台管理页面,我们选择了AntDesignPro,它是基于AntDesign和umi的封装的一整套企业级中后台前端/设计解决方案。坑位按官方文挡一步步下来,项目启动后发现控制台就有一个报错,报错截图如下:Why?从报错的提示看是项目出现了a标签嵌套a标签的情况,最......
  • [ABC202E] Count Descendants 题解
    CountDescendants题目大意给定一颗以\(1\)为根的树,多次询问求某点的子树中深度为给定值的点的个数。思路分析对于每个深度开一个vector,从大到小存下这个深度的所有点的dfs序开始值和结束值,询问时只需要在对应深度的vector中二分作差即可。代码#include<iostream>#......
  • React Warning: validateDOMNesting(...): <div> cannot appear as a descendant of <p>.
    报错信息umi.js:68474Warning:validateDOMNesting(...):<div>cannotappearasadescendantof<p>.其实不难看出是它提示你应该在p标签中写一个select这里造成错误......
  • You need to use a Theme.AppCompat theme (or descendant) with this activity解决方
    在创建一个对话框风格的窗口时,报错报错如下:java.lang.RuntimeException:UnabletostartactivityComponentInfo{com.example.test2/com.example.test2.MainActivity}:j......