[AGC009C] Division into Two

先假定 AB,然后先判断无解,
如果 ai+2ai<B,无论怎么分配都是不合法的,直接判掉。
然后考虑 dp,fi 表示选了前 i 个数,其中第 i 个数是归为 A 集合的方案数。
其中不难发现可转移的状态是一段区间,状态 fj 可以转移仅当 aiajAaj+1aj1 都可以被归到 B 集合。
使用前缀和优化,时间复杂度 O(n)

const int N = 1e5 + 5;
int n;
ll A, B, a[N];
int f[N], s[N];
void solve() {
	cin >> n >> A >> B;
	if(A < B) swap(A, B);
	FOR(i, 1, n) cin >> a[i];
	FOR(i, 1, n - 2) {
		if(a[i + 2] - a[i] < B) {
			cout << 0 << endl;
			return;
		}
	}
	f[0] = s[0] = 1;
	int l = 0, r = 0;
	FOR(i, 1, n) {
		while(l < i && a[i] - a[l + 1] >= A) l++;
		if(r <= l) f[i] = (s[l] - (r ? s[r - 1] : 0) + P) % P;
		s[i] = (s[i - 1] + f[i]) % P;
		if(i > 1 && a[i] - a[i - 1] < B) r = i - 1; 
	}
	int ans = 0;
	ROF(i, n, 0) {
		ans = (ans + f[i]) % P;
		if(i < n && a[i + 1] - a[i] < B) break;
	}
	cout << ans << endl;
}
posted @   KevinLikesCoding  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示