P10542 [THUPC2024] RPG

P10542 [THUPC2024] RPG

My Blogs

P10542 [THUPC2024] RPG

一个有配合的“状态加攻击”一定是一个连续段,段内都在摸鱼。所以设 fi 表示考虑了前 i 个人的最大收益:

fi={fi1+dbimax(x,y,z)E,y=bigx+z+dbi

其中 gi 表示满足 aj=i 的最大的 fj1。暴力做是 n2 的,原因在于一个 y 对应的 x 可能会过多。

然后第二个式子只和 y 有关。所以考虑根号分治,对于一种 y,如果其入度过多,将其单独处理(每转移一位统计存在 x=aiy)。取阈值为 n 可以做到 O(nn)。实现不能太烂(有点卡常)。

	int n,m,X,Y,d[200010],a[200010],b[200010];
	int val[200010],now[200010],f[200010];
	vector<pii> ve[200010];
	vector<pii> nex[200010];
	vi tmp;
	const int B=700;
	inline void mian()
	{
		read(n,m,X,Y);int x,y,z;
		for(int i=1;i<=X;++i)read(d[i]);
		for(int i=1;i<=n;++i)read(a[i],b[i]);
		while(m--)read(x,y,z),ve[y].eb(mp(x,z));
		memset(val,128,sizeof(val)),memset(now,128,sizeof(now));
		for(int i=1;i<=X;++i)if(ve[i].size()>B)
		for(auto p:ve[i])nex[p.fi].eb(mp(i,p.se));
		for(int i=1;i<=n;++i)
		{
			f[i]=f[i-1]+d[b[i]];
			if(ve[b[i]].size()<=B)
			{
				for(auto p:ve[b[i]])
				Mmax(f[i],val[p.fi]+p.se+d[b[i]]);
			}
			else Mmax(f[i],now[b[i]]+d[b[i]]);
			Mmax(val[a[i]],f[i-1]);
			for(auto p:nex[a[i]])Mmax(now[p.fi],p.se+f[i-1]);
		}
		write(f[n]);
	}
posted @   WrongAnswer_90  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

This blog has running: 562 days 8 hours 45 minutes 0 seconds

点击右上角即可分享
微信分享提示