首页 > 其他分享 >CodeForces 1943D2 Counting Is Fun (Hard Version)

CodeForces 1943D2 Counting Is Fun (Hard Version)

时间:2024-03-18 13:14:10浏览次数:26  
标签:typedef Hard 容斥 CodeForces long Version maxn Fun define

洛谷传送门

CF 传送门

被自己的赛时智障操作气笑了。谁告诉你容斥钦定了几个要记到状态里面的。。。/tuu

显然先找“好数组”的充要条件。对原数组 \(a\) 差分,设 \(b_i = a_i - a_{i - 1}\)。那么一次可以选择一对 \((i, j)\) 满足 \(i \le j - 2\),然后给 \(b_i\) 减 \(1\),给 \(b_j\) 加 \(1\)。

我们从左往右操作。注意到我们不能操作相邻的一对元素,所以若某个时刻 \(b_i > 0\) 且 \(b_{1 \sim i - 2}\) 都为 \(0\) 就不合法。这就是充要条件。

充要条件可以表述成 \(b_i + \sum\limits_{j = 1}^{i - 2} b_j \ge 0\),即 \(a_i - a_{i - 1} + a_{i - 2} \ge 0\),注意 \(a_0 = a_{n + 1} = 0\)。

对于 \(n \le 400\) 可以直接做一个 \(O(n^3)\) dp,设 \(f_{i, j, k}\) 为考虑了 \([1, i]\) 的前缀,\(a_{i - 1} = j, a_i = k\) 的方案数。因为合法的 \(a_{i - 2}\) 是一段后缀,所以预处理后缀和即可做到 \(O(1)\) 转移。这样可以通过 D1。

对于 \(n \le 3000\) 显然不能这么做了。发现 dp 状态数都成瓶颈了,换个思路,考虑容斥,钦定一些位置 \(i\) 是满足 \(a_i > a_{i - 1} + a_{i + 1}\)(显然这些位置不会相邻),容斥系数就是 \(-1\) 的位置个数次方。

对于 \(i\) 被钦定的方案,注意到我们不用枚举 \(a_i\),只要知道 \(a_{i - 1}\) 和 \(a_{i + 1}\),就能算出 \(a_i\) 的取值个数为 \(m - a_{i - 1} - a_{i + 1}\)(令题面中的 \(k\) 为 \(m\))。

所以设 \(f_{i, j}\) 为考虑了 \([1, i]\) 的前缀,\(a_i = j\),每种方案乘上容斥系数的和。那么有 \(f_{i, j} = \sum\limits_{k = 0}^m f_{i - 1, k} - (m - j - k) f_{i - 2, k}\),容易前缀和优化。

时间复杂度 \(O(n^2)\)。

code
// Problem: D2. Counting Is Fun (Hard Version)
// Contest: Codeforces - Codeforces Round 934 (Div. 1)
// URL: https://codeforces.com/contest/1943/problem/D2
// Memory Limit: 1024 MB
// Time Limit: 3000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 3030;

ll n, m, mod, f[maxn][maxn], g[maxn], h[maxn];

void solve() {
	scanf("%lld%lld%lld", &n, &m, &mod);
	f[0][0] = 1;
	for (int i = 1; i <= n + 1; ++i) {
		ll s = 0;
		for (int j = 0; j <= m; ++j) {
			s = (s + f[i - 1][j]) % mod;
		}
		for (int j = 0; j <= m; ++j) {
			f[i][j] = s;
		}
		if (i >= 2) {
			for (int j = 0; j <= m; ++j) {
				g[j] = f[i - 2][j];
				h[j] = f[i - 2][j] * j % mod;
				if (j) {
					g[j] = (g[j] + g[j - 1]) % mod;
					h[j] = (h[j] + h[j - 1]) % mod;
				}
			}
			for (int j = 0; j <= m; ++j) {
				ll x = (g[m - j] * (m - j) - h[m - j] + mod) % mod;
				f[i][j] = (f[i][j] - x + mod) % mod;
			}
		}
	}
	printf("%lld\n", f[n + 1][0]);
}

int main() {
	int T = 1;
	scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,Hard,容斥,CodeForces,long,Version,maxn,Fun,define
From: https://www.cnblogs.com/zltzlt-blog/p/18080141

相关文章

  • Codeforces Round 933 G. Rudolf and Subway
    原题链接:Problem-G-Codeforces思路:根据题意可知相同颜色的边一定是联通的,那么就可以设置虚点,例如1-2,2-3,3-4边的颜色都是相同的,那么就可以设置一个特殊的点例如设置为10,那么这三条边就可以改成1-10,10-2,2-10,10-3,3-10,10-4,从点到虚点需要1的代价,但是从虚点到其他点不需要代价,......
  • CodeForces 1943C Tree Compass
    洛谷传送门CF传送门发现对于一条链,一次操作最多能染黑这条链上的\(2\)个点。所以我们把直径拎出来,设直径长度为\(d\)。考虑一条长度为\(d\)的链至少要多少次能全染黑。若\(d\)为奇数,显然从直径中点\(u\)开始做\((u,0),(u,1),\ldots,(u,\frac{d-1}{2})\)......
  • Codeforces Round 933 Rudolf and k Bridges
    原题链接:Problem-E-Codeforces题目大意:给一个行为n列为m的河流二维数组,数字代表河流的深度。题目要求连续建造k座桥,桥的定义是从第一列到第m列,每隔d需要按照支架,安装支架的代价是深度+1。问安装最少需要多少代价?思路:单调队列优化dp,dp数组只需要一维,dp[i]的含义是从1到i建......
  • codeforces 1931E
    题目链接简介:对一些数字,余念安可以反转一个数字,齐夏将两个数字首尾相连变为一个数字。每个人都采取最优策略。名单上只剩下一个号码。如果该整数不小于 10的m次方,则齐夏获胜。否则余念安就赢了。分析:博弈论问题,结局已经确定,可知变成了位数个数之争,齐夏要通过合并数字使得......
  • Codeforces Round 934 (Div. 1)
    Preface真是一场酣畅淋漓的掉分啊,一场回到解放前了属于是这把虽然有不可抗力的原因(电脑半路蓝屏了),但不知道为什么状态就特别差A刚开始没清空干净WA了2发后就心态崩了,然后加上头疼难耐B题也没看出关键trick直接写了个不仅错还巨难写的东西不过yysy这场Guess的成分是否有点太高......
  • 论文解读(CGC)《Generating Counterfactual Hard Negative Samples for Graph Contrasti
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:GeneratingCounterfactualHardNegativeSamplesforGraphContrastiveLearning论文作者:论文来源:2023WWW论文地址:download 论文代码:download视屏讲解:click0-摘要图对比学习已经成为一种强大的无监督图......
  • 每日一题 第七期 Codeforces Round 929 (Div. 3) Editorial
    TurtleTenacity:ContinualModsD.TurtleTenacity:ContinualModstimelimitpertest:2secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputGivenanarraya......
  • Codeforces Round 934 (Div. 2)
    CodeforcesRound934(Div.2)A-DestroyingBridges解题思路:完全图每个点的连边数为\(n-1\)。\(k<n-1\):都可到达。\(k\geqn-1\):将点\(1\)的边删完,只能呆在点\(1\)。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=......
  • Arthas - Can not read arthas version from: https://arthas.aliyun.com/api/latest_
    问题描述[ERROR]Cannotreadarthasversionfrom: https://arthas.aliyun.com/api/latest_version[ERROR]CannotfindArthasunderlocal:/root/.arthas/libandremoterepomirror:aliyun[ERROR]Unabletodownloadarthasfromremoteserver,pleasedownload......
  • XOR Break — Solo Version
    题意思路最多两步解决1.一步:只要满足((n^m)<n)即可一步,只要在第一个mi=1的地方n也有1无论如何都可以随便改n得到m2.无解的情况:只要在第一个mi=1的时候n(i)->n(最高位-1)没有1出现肯定无法解决3.二步:类似于10110->0000110110->10101->00001只需......