Codeforces Round 889 (Div. 2) A-E

传送门,不用谢。
A
给出排列每次可以交换两个数字,求最少多少次使得排列为错排。

考虑在原位的数字个数为cnt

则答案显然为(cnt+1)>>1

B
求一个最大区间满足其中说有数字被n整除

极其有趣,注意到样例解释具有迷惑性。

考虑一个序列[l,r]为答案 那么从中可以看出1|n,2|n,3|n,...rl+1|n

由此可知[1,rl+1]也是答案。

那么做法就有了。

C1
给出一个长为n的序列20ai20

每次可以使得ai加上aji,j可以相等。让不超过50次使得整个序列是不降的。

随便做就行,考虑花5次培养一个极大值或者极小值。

然后对每个数挨个加譬如用极大值来做给当前ai加上两次极大值或者加上一次极大值一次ai1

这样最多45次。可以通过。

C2
考虑操作被压缩到了31次。这个界非常的紧。

想了1h之后发现先将所有数字都变得0或者0再通过一次前缀和或后缀和即可。

前缀和要19次也就是说通过12次操作使得整个序列变成上述那样。

考虑正数负数一半一半且正数有最大值,这显然可以完成。

只需要考虑正数比较少且正数有最大值比如正数7个负数13

负数至少是有一个1的否则可以认为整个序列已经全部0了。

此时利用5次培养一个极小的负值来让正数全部0即可。

恰好卡到了31次。

D
容易想到如果最终结束点是i那么所得到的价值可以直接知道(ai)(i1)

考虑枚举所有的结束点,问题的关键是当前结束点是否可以到达。

就变成了一个可达性问题,设fi,j表示用了前i个数,对于j是否可达。

转移就是普通的背包,这个经典问题可以利用bitset来优化。复杂度n2w

E
这就更有意思了。题意不再赘述。

将问题模型想成数轴上的点,每个点可以往前走。

和前面那个点相遇这个点就消失。

这样由期望的线性性我们假想一个点和前面那个点要么相遇要么不相遇。

每个点如果不和前面点相遇期望步数为m+1ai

那么只需要减去相遇步数即可利用fx,y表示两点位置的期望要减去步数dp即可。

int n,k,m,T,cnt,lim,B;
int f[MAXN][MAXN];
int ans;
inline int dp(int x,int y)
{
	if(x==y)return m-x+1;
	if(y==m+1)return 0;
	if(f[x][y])return f[x][y];
	f[x][y]=((ll)dp(x+1,y)*G+(ll)dp(x,y+1)*G)%mod;
	return f[x][y];
}
signed main()
{
	freopen("1.in","r",stdin);
	sc(n);sc(m);
	int x=0,y;
	rep(1,n,i)
	{
		sc(y);
		ans=(ans+(m-y+1))%mod;
		if(x)ans=(ans+mod-dp(x,y))%mod;
		x=y;
	}
	put(ans);
	return 0;
}
posted @   chdy  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2019-08-02 noi 2017 整数
点击右上角即可分享
微信分享提示