求助:寄搜超时
查看原帖
求助:寄搜超时
556740
hzx360楼主2023/2/26 13:34

一直卡在 #14 为了加速线段树都用上了。。。

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,N=1310;
int n,m,cnt,a[N],pl[N],pr[N];
long long dp[N][N];
int g[N][N],pos[N][N];
#define lson o<<1
#define rson o<<1|1
struct node{int l,r,mi,pos;}t[N<<1];
void build(int o,int l,int r){
	t[o].l=l,t[o].r=r;if(l==r){t[o].mi=a[l];return;}
	int mid=(l+r)>>1;
	build(lson,l,mid),build(rson,mid+1,r);
	t[o].mi=min(t[lson].mi,t[rson].mi);
}
int query(int o,int l,int r){
	if(t[o].l==l and t[o].r==r) return t[o].mi;
	int mid=(t[o].l+t[o].r)>>1;
	if(r<=mid) return query(lson,l,r);
	else if(l>mid) return query(rson,l,r);
	else return min(query(lson,l,mid),query(rson,mid+1,r));
}
void deal(){
	n=cnt;for(int i=1;i<=n;i++) g[a[i]][++g[a[i]][0]]=i;
	build(1,1,n);for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) pos[i][j]=query(1,i,j);
}
long long dfs(int l,int r){
	if(l>=r) return 1;
	if(dp[l][r]) return dp[l][r];
	int p=pos[l][r];
	int lpos=g[p][1],rpos=g[p][g[p][0]];
	long long suml=0,sumr=0,ans=0;
	for(int i=l;i<=lpos;i++) suml=(suml+dfs(l,i-1)*dfs(i,lpos-1))%mod;
	for(int i=rpos;i<=r;i++) sumr=(sumr+dfs(rpos+1,i)*dfs(i+1,r))%mod;
	ans=suml*sumr%mod;
	for(int i=1;i<=g[p][0]-1;i++) ans=ans*dfs(g[p][i]+1,g[p][i+1]-1)%mod;
	return dp[l][r]=ans;
}	
signed main(){
	cin>>n>>m;int po=0;
	for(int i=1,x;i<=m;i++){
		scanf("%d",&x);
		if(x!=po) a[++cnt]=x,po=x;
	}
	if(cnt>2*n) return puts("0"),0;
	deal(),dfs(1,n);
	cout<<dp[1][n];
}
2023/2/26 13:34
加载中...