笛卡尔树上DP TLE#2 求调
查看原帖
笛卡尔树上DP TLE#2 求调
91433
czy0407楼主2024/3/21 11:25
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e5+10;
ll t,n,a[N],son[N][5],sta[N],top,f[N],fa[5],mod=998244353;
void dfs(int u)
{
	if(!u)return;
	int ls=son[u][0],rs=son[u][1];
	fa[1]++;
	dfs(ls);
	fa[1]--;
	fa[2]++;
	dfs(rs);
	fa[2]--;
	f[u]+=f[ls]*f[rs];
	f[u]%=mod;
	if(fa[1])f[u]+=f[ls];
	f[u]%=mod;
	if(fa[2])f[u]+=f[rs]; 
	f[u]%=mod;
	if(fa[1]&&fa[2])f[u]--;
}
int main()
{
	ios::sync_with_stdio(0);
	cin>>t;
	while(t--)
	{
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			while(a[sta[top]]>a[i]&&top)son[i][0]=sta[top--];
			if(sta[top])son[sta[top]][1]=i;
			sta[++top]=i;
		}
		f[0]=1;
		dfs(sta[1]);
		cout<<f[sta[1]]%mod<<"\n";
		memset(f,0,sizeof(f));
		memset(sta,0,sizeof(sta));
		memset(son,0,sizeof(son));
		memset(fa,0,sizeof(fa));
		top=0;
	}
	return 0;
}	
2024/3/21 11:25
加载中...