首页 > 其他分享 >CF1748E Yet Another Array Counting Problem の Solution

CF1748E Yet Another Array Counting Problem の Solution

时间:2024-04-10 13:23:51浏览次数:27  
标签:sta 笛卡尔 int Solution 儿子 CF1748E Yet dp dis

Link

有些人还是啥都不会。

看到题目应该能想到这是笛卡尔树的性质,因为每一对 \((l,r)\) 都满足最左端最大值位置相同,所以说明在笛卡尔树上,每一对点的 lca 相同,说明 \(a\) 和 \(b\) 序列的笛卡尔树相同。

我们以下标为键,\(a_i\) 为值建立大根笛卡尔树,现在题目就转换成在这个树上填值满足笛卡尔树的形态不变。

因为计数,考虑动态规划,设 \(dp_{u,j}\) 表示当前点为 \(u\),填写了 \(j\) 的方案数,分三类讨论即可。

  • 如果没有儿子,\(dp_{u,j}=1\)。
  • 如果只有一个儿子,如果是左儿子,那左儿子只能填 \([1,j-1]\),因为根据键的性质,左儿子键值小于 \(u\),如果填了大于 \(j-1\) 的数的话,就不满足左端最大值在 \(u\) 的限制条件了,而是在左儿子。如果是只有右儿子的话,那右儿子填 \([1,j]\) 均可。
  • 如果有两个儿子,根据上文,左儿子可以填 \([1,j-1]\),右儿子可以填 \([1,j]\),加法原理即可。

具体转移方程见代码。

这个转移显然是可以 \(O(m)\) 搞出来的,所以总时间就是 \(O(\sum n \times m)\)。

注意要用 vector 来开数组。

#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
const int mod=1e9+7;
#define int long long 
struct node{
	int l,r;
}dis[N];
struct edge{
	int v,id;
};
struct node1{
	int k,w;
};
int t,n,m,a[N];
vector<long long> dp[N];
vector<edge> g[N];
stack<node1> sta;
void Clear(){
	for(int i=1;i<=n;i++)	g[i].clear(),dp[i].clear(),dis[i].l=dis[i].r=0;
}
void DP(int u){
	dp[u].push_back(0);
	if(g[u].size()==0)	for(int i=1;i<=m;i++)	dp[u].push_back(1);
	else if(g[u].size()==1){
		DP(g[u][0].v);
		int sum=0;
		if(g[u][0].id==1)	for(int i=1;i<=m;i++)	dp[u].push_back(sum),sum+=dp[g[u][0].v][i],sum%=mod;
		else	for(int i=1;i<=m;i++)	sum+=dp[g[u][0].v][i],dp[u].push_back(sum),sum%=mod;
	}
	else{
		DP(g[u][0].v),DP(g[u][1].v);
		int sum1=0,sum2=0;
		for(int i=1;i<=m;i++)	sum2+=dp[g[u][1].v][i],sum2%=mod,dp[u].push_back((sum1%mod*sum2%mod)%mod),sum1+=dp[g[u][0].v][i],sum1%=mod;
	}
}
void Slove(){
	for(int i=1;i<=n;i++){
		int lst=0;
		while(!sta.empty()&&a[i]>sta.top().w)	lst=sta.top().k,sta.pop();
		if(sta.empty())	dis[i].l=lst;
		else{
			int now=sta.top().k;	
			dis[i].l=dis[now].r;dis[now].r=i;
		}
		sta.push({i,a[i]});
	}
	for(int i=1;i<=n;i++){
		if(dis[i].l!=0)	g[i].push_back({dis[i].l,1});
		if(dis[i].r!=0)	g[i].push_back({dis[i].r,0});
//		cout<<i<<" "<<dis[i].l<<" "<<dis[i].r<<endl;
	}
	int lst1=0;
	while(!sta.empty())	lst1=sta.top().k,sta.pop();
	DP(lst1);
//	cout<<lst1<<" ";
	long long ans=0;
	for(int i=1;i<=m;i++)	ans+=dp[lst1][i],ans%=mod;
	cout<<ans<<endl;
	Clear();
//	cout<<dp[2][2]<<endl;
}
signed main(){
	cin>>t;
	while(t--){
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)	scanf("%d",&a[i]);
		Slove();
	}
}
/* chong xin an pai zhi 
 dp[u][j] = dp[v1][1-->j-1]*dp[v2][1-->j]
*/
/*
4
4 2
2 2 2 2
*/

标签:sta,笛卡尔,int,Solution,儿子,CF1748E,Yet,dp,dis
From: https://www.cnblogs.com/JuneFailue/p/18125816

相关文章

  • Randomness Is All You Need: Semantic Traversal of Problem-Solution Spaces with L
    本文是LLM系列文章,针对《RandomnessIsAllYouNeed:SemanticTraversalofProblem-SolutionSpaceswithLargeLanguageModels》的翻译。随机性就是你所需要的:具有大型语言模型的问题解决空间的语义遍历摘要1引言2相关工作3模型4算法5评估6实现7结论摘......
  • CF1934B Yet Another Coin Problem 题解
    CF1934BYetAnotherCoinProblem题解题意目前有\(5\)种硬币,面值分别为\(1,3,6,10,15\)。给你一个数字\(n\),求出可以凑出\(n\)的最少的硬币的数量。思路这道题,大多数的人大概会想到动态规划的方法。但是,我们应该有敢于创新的精神。于是我就想到了一个简单的数学方法......
  • 【2021.6.26 NOI模拟】Problem B. 简单题 another solution
    ProblemDescriptionInput从文件b.in中读入数据。一个正整数n。Output输出到文件b.out中。一个整数表示答案。SampleDataInput#1Copy5Output#1Copy31Input#2Copy50Output#2Copy2885DataConstraint首先,我们从小到大枚举\(n\),假设当前枚举......
  • Microservice - Solution Selection for Distributed Transaction Framework
      ......
  • window下解决Kibana server is not ready yet的问题
    一、问题描述ElasticSearch配置账号密码后,启动Kibana会出现错误,打开http://127.0.0.1:5601/,Kibana会提示:Kibanaserverisnotreadyyet,Kibana启动界面报错如图所示:二、解决方法出现这个错误的原因是,配置文件没有放开kibana的账号密码配置,如图:打开配置文件,在kibana-......
  • [Paper Reading] VQ-GAN: Taming Transformers for High-Resolution Image Synthesis
    名称[VQ-GAN](TamingTransformersforHigh-ResolutionImageSynthesis)时间:CVPR2021oral21.06机构:HeidelbergCollaboratoryforImageProcessing,IWR,HeidelbergUniversity,GermanyTL;DRTransformer优势在于能较好地长距离建模sequence数据,而CNN优势是天生对局部......
  • AWS Solutions Architect - Prep
    What'sAWSS3databaseforunstructureddata,wecanputastaticwebsite(doesn'tneedthatmuchback-end)onS3WhyuseS3highscalabilityhorizontalscaling:storagedoesn'tfulfilltheneed,thenjustusemoredevicesverticalscali......
  • 【Unity】调整Player Settings的Resolution设置无效
    【背景】Build时修改了PlayerSettings下的Resolution设置,但是再次Building时仍然不生效。【分析】明显是沿用了之前的分辨率设定,所以盲猜解决办法是Build相关的缓存文件,或者修改打包名称。【解决】实测修改版本号无效,必须修改productName才会使Resolution设置生效。......
  • CodeForces 1936E Yet Yet Another Permutation Problem
    洛谷传送门CF传送门首先设\(a_i=\max\limits_{j=1}^ip_j\),\(b_i=\max\limits_{j=1}^iq_j\)。直接容斥,钦定有多少值不同的\(a_i\)使得\(a_i=b_i\)。然后再把钦定的每种值转化成每种值第一次使得\(a_i=b_i\)的位置\(i\)。也就是说我们现在要钦定一些位置,......
  • Solution Set - 数学
    A-PerpetualSubtraction题意:一个数有pi的概率为i,一次操作将数随机变为小于等于它的数,为m次操作后变为每个数的概率。给出的最大数\(N(1 ≤ N ≤ 10^5)\),操作数\(M(0 ≤ M ≤ 10^{18})\)。首先有\(O(nm)\)的dp,\(f_{i,j}\)为经过i此操作后为数j的概率,有转移\(f_{i,j}......