ABC 313

省流:ABC 没有什么好讲的,DEG 比较简单。

D

先求出 1 和其他数的异或值,再计算。

第一种是 2nk+1 的,第二种是 nk+2n 的。

E

连续两个 >1 不会结束,其他的情况从后往前处理即可。

计算每一个 >1 的贡献是几个 1

F

  • 如果出现 Xi=Yi,必须翻,如果 Bi>Ai,先翻过来再说,不会更劣。后面只考虑 XiYi

  • 如果对于一个 a,有 Xi=aYi=aa 翻转的概率是 12,否则为 0。(可以用二项式定理证明)

  • 抽象成图,XiYi 连一条边。

  • 每个点权是 Ai+Bi2Ai,是选择它的“贡献”。

  • 显然,连接两个点权是正的边,直接连接;连接两个点权是负的边,不可能连接。处理完,去掉这些边。

  • 图变成了二分图。40÷2=20220 很合理。

  • 若负的点数量 20,可以直接枚举,与它们连的正的边一定会选,O(220×202),预处理可以 O(220×20)。(最坏)

  • 反之,在正的上面 dp,dpi,msk 代表负的中选到了 i,正的选了 mskO(220×20)

  • submission

G

操作 A 都在 B 前面,这样答案不会重复(AB 后面相当于没做)。把问题转化成求 floor sum,类欧板子套上去即可。

Ex

  • AB 排序没有影响。

  • 定义 CCi=min(Ai,Ai1),C1=A1,CN+1=AN

  • Bi>Ci 即可。

考虑插入 dp。dpi,j(ij) 表示前 iA 分成 j 段(此时 B 到了 i+j)。段数从 a 变到 b 时,Ba,Ba+1,,Bb 均要大于 Ai+1

转移 3 种情况:

  • Ai 单独成段。

  • Ai 在一段左或右边。

  • Ai 连接两段。

代码很好写。

code
#include <bits/stdc++.h>

using namespace std;

#define de(x) cout<<#x<<"="<<x<<endl

using ll = long long;

const int N = 5e3+3;
const ll mod = 998244353;

int n;
int a[N],b[N];
ll dp[N][N];

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>n;
	for (int i=0; i<n; i++){
		cin>>a[i];
	}
	for (int i=0; i<n+1; i++){
		cin>>b[i];
	}
	sort(a,a+n);
	sort(b,b+1+n);
	dp[0][0]=1;
	for (int i=0; i<n; i++){
		for (int bl=0; bl<=i; bl++){
			for (int ty=0; ty<3; ty++){
				if (i+bl+1-ty>n || ty>bl){
					continue;
				}
				if (ty!=2 && b[i+bl]<a[i]){
					continue;
				}
				if (ty==0){
					(dp[i+1][bl+1]+=dp[i][bl]*1ll*(bl+1)%mod)%=mod;
				}
				if (ty==1){
					(dp[i+1][bl]+=dp[i][bl]*1ll*(2ll*bl)%mod)%=mod;
				}
				if (bl-1>=0 && ty==2){
					(dp[i+1][bl-1]+=dp[i][bl]*1ll*(bl-1)%mod)%=mod;
				}
			}
		}
	}
	cout<<dp[n][1]<<endl;
	return 0;
}

// don't waste time!!!

很像 loj 2743。收录于 我的这个博客

posted @   SFlyer  阅读(38)  评论(0编辑  收藏  举报
相关博文:
·  ABC 314 G
·  ABC313
·  ABC323
·  ABC 313
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示