省选模拟14

T1

考虑区间 dpfl,r 表示删完 l,r 这个区间的最大价值

考虑 l,r 在一次被删掉

发现好的子串一定是前一段上升,后一段下降

于是可以再开两个 gl,r 表示以 l,r 分别为两个端点中间剩下恰好递增或递减的最大价值

那么可以枚举一个最大值的位置转移

l,r 不在一次被删掉,可以枚举一个断点来转移

因为可以不删完,所以可以再开个 dp 解决

Code
#include<bits/stdc++.h>
#define int long long
#define rint signed
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
int n,ans,U;
int a[410],v[410];
int f[410][410],g1[410][410],g2[410][410],F[410];
signed main(){
#ifdef LOCAL
	freopen("in","r",stdin);
	freopen("out","w",stdout);
#endif
	freopen("good.in","r",stdin);
	freopen("good.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++) v[i]=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=g1[i][j]=g2[i][j]=-inf;
	for(int i=1;i<=n;i++) f[i][i]=v[1],f[i][i-1]=g1[i][i]=g2[i][i]=0;
	for(int len=2;len<=n;len++) for(int l=1,r;l<=n-len+1;l++){
		r=l+len-1;
		for(int k=l;k<=r;k++){
			if(a[k]==a[r]-1) g1[l][r]=max(g1[l][r],g1[l][k]+f[k+1][r-1]);
			if(a[k]==a[l]-1) g2[l][r]=max(g2[l][r],g2[k][r]+f[l+1][k-1]);
		}
		for(int k=l;k<=r;k++) if(a[k]>=a[l]&&a[k]>=a[r]&&a[k]*2-a[l]-a[r]+1<=n) f[l][r]=max(f[l][r],g1[l][k]+g2[k][r]+v[a[k]*2-a[l]-a[r]+1]);
		for(int k=l;k<r;k++) f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]);
	}
	F[0]=0;for(int i=1;i<=n;i++){
		F[i]=F[i-1];
		for(int j=0;j<i;j++) F[i]=max(F[i],F[j]+f[j+1][i]);
	}
	printf("%lld\n",F[n]);
	return 0;
}

T2

只会暴力枚举出边

T3

fi 表示长度为 i 的悦耳的旋律的个数

那么 fi=i=1nvij=1i2fjk=j+1ijvk

就是考虑枚举最小的 border 进行转移(如果有 border 那么最小 border 的长度一定小于 n2 ),前面的和后面的一样,中间的可以随便选

si=j=1ivj

于是 fi=sij=1i2fjsijsj1

发现可以分治 ntt

而且只需要计算 [1,n2] 的值,最后再 O(n)fn

Code
#include<bits/stdc++.h>
#define int long long
#define rint signed
#define mod 998244353
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
int n,ans,len,L,INV;
int s[2097152],inv[2097152];
int f[2097152],g[2097152],r[2097152];
int a[2097152],b[2097152];
inline int qpow(int x,int k){
	int res=1,base=x;
	while(k){if(k&1) res=res*base%mod;base=base*base%mod;k>>=1;}
	return res;
}
inline void init(int len,int L){
	for(int i=0;i<len;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(L-1));
	g[0]=1,g[1]=qpow(3,(mod-1)/len);for(int i=2;i<len;i++) g[i]=g[i-1]*g[1]%mod;
}
inline void rev(int len){g[0]=1,g[1]=qpow(g[1],mod-2);for(int i=2;i<len;i++) g[i]=g[i-1]*g[1]%mod;}
inline void md(int &x){x=(x>=mod)?x-mod:x;}
inline void ntt(int a[]){
	for(int i=0;i<len;i++) if(i<r[i]) swap(a[i],a[r[i]]);
	for(int d=1,t=len>>1;d<len;d<<=1,t>>=1) for(int i=0;i<len;i+=(d<<1)) for(int j=0;j<d;j++){
		int tmp=g[t*j]*a[i+j+d]%mod;
		md(a[i+j+d]=a[i+j]-tmp+mod);
		md(a[i+j]=a[i+j]+tmp);
	}
}
void solve(int l,int r){
	if(l==r){
		md(f[l]=s[l]-f[l]+mod);
		md(f[l+l]=f[l+l]+f[l]);
		return ;
	}
	int mid=(l+r)>>1;solve(l,mid);
	for(len=1,L=0;len<r-l+1;len<<=1,L++);init(len,L);
	for(int i=0;i<len;i++) a[i]=b[i]=0;
	for(int i=l;i<=mid;i++) a[i-l]=f[i]*inv[i]%mod;
	for(int i=mid+1;i<=r;i++) b[i-mid-1]=s[i];
	ntt(a);ntt(b);rev(len);
	for(int i=0;i<len;i++) a[i]=a[i]*b[i]%mod;
	ntt(a);INV=qpow(len,mod-2);
	for(int i=0;i<len;i++) a[i]=a[i]*INV%mod;
	for(int i=0;i<len;i++) md(f[i+l+mid+1]=f[i+l+mid+1]+a[i]);
	solve(mid+1,r);
}
signed main(){
#ifdef LOCAL
	freopen("in","r",stdin);
	freopen("out","w",stdout);
#endif
	freopen("music.in","r",stdin);
	freopen("music.out","w",stdout);
	n=read();for(int i=1;i<=n;i++) s[i]=read();
	s[0]=1;for(int i=1;i<=n;i++) s[i]=s[i-1]*s[i]%mod;
	s[0]=0;for(int i=1;i<=n;i++) inv[i]=qpow(s[i],mod-2);
	solve(1,n/2);f[n]=s[n];
	for(int j=1;j<=n/2;j++) md(f[n]=f[n]-f[j]*s[n-j]%mod*inv[j]%mod+mod);
	printf("%lld\n",f[n]);
	return 0;
}
posted @   Max_QAQ  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示