首页 > 其他分享 >CF1622D. Shuffle 题解 组合数学/枚举

CF1622D. Shuffle 题解 组合数学/枚举

时间:2022-10-30 11:37:01浏览次数:74  
标签:Shuffle int 题解 sum -- maxn CF1622D c1 c0


题目链接:​​https://codeforces.com/problemset/problem/1622/D​

题目大意:给定一个长度为 \(n\) 的 01字符串 \(s\),你可以对这个字符串进行最多一次操作,该次操作需要选择一个恰好包含 \(k\) 个 1 的子串,并将这个子串中的元素任意调整顺序。问:能够得到多少个不同的字符串(答案对 \(998244353\)

解题思路:

我们假设对一个子串进行位置的调整,其中最前面那个变化过的字符的位置是 \(i\),最后面那个变化过的字符的位置是 \(j\),则因为位置 \(i\) 和 \(j\) 变化过,统计一下 \(i\) 和 \(j\) 中间的元素个数(\(j - i - 1\) 个),然后再计算一下中间要放几个 1 和 0,如果区间 \([i+1, j-1]\) 范围内要放 \(c_1\) 个 1 和 \(c_0\) 个 0,则对答案的贡献为 \(C_{c_1 + c_0}^{c_1}\)(注意,可能会有些状态不合法,比如 \(k = 2\) 时子串是 "11" 就是不可行的,可以通过 \(c_1 \lt 0\) 或 \(c_0 \lt 0\)

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5050;
const long long MOD = 998244353;

int n, k, sum[maxn], c[maxn][maxn];
char s[maxn];
long long ans = 1;

void init() {
c[0][0] = 1;
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= i; j++) {
if (j==0 || j==i) c[i][j] = 1;
else c[i][j] = (c[i-1][j-1] + c[i-1][j]) % MOD;
}
}
}

int main() {
scanf("%d%d%s", &n, &k, s+1);
init();
for (int i = 1; i <= n; i++)
sum[i] = sum[i-1] + (s[i] == '1');
if (k > sum[n]) {
puts("1");
return 0;
}
for (int i = 1; i <= n; i++) {
for (int j = i+1; j <= n && sum[j] - sum[i-1] <= k; j++) {
int c1 = sum[j] - sum[i-1], c0 = j - i + 1 - c1;
if (s[i] == '0') c1--;
else c0--;
if (s[j] == '0') c1--;
else c0--;
if (c0 >= 0 && c1 >= 0) {
ans = (ans + c[c0+c1][c1]) % MOD;
}
}
}
printf("%lld\n", ans);
return 0;
}

参考资料:​​https://codeforces.com/blog/entry/98453​



标签:Shuffle,int,题解,sum,--,maxn,CF1622D,c1,c0
From: https://blog.51cto.com/u_13536312/5807471

相关文章

  • WIN2012远程桌面授权服务器许可证问题解决方法
    WIN2012服务器报错为由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开。请跟服务器管理员联系。原因是服务器安装了远程桌面服务RemoteApp,这个是需要授权的。微......
  • P2299Mzc和体委的争夺战题解
    这是一道Dijkstra经典题目(裸题)P2299Mzc和体委的争夺战代码思路:Dijkstra+链式前向星+优先队列+结构体其实很简单的重点:if(vis[n])return;意思是找到了立即返回......
  • Python 多重继承时metaclass conflict问题解决与原理探究
    背景最近有一个需求需要自定义一个多继承abc.ABC与django.contrib.admin.ModelAdmin两个父类的抽象子类,方便不同模块复用大部分代码,同时强制必须实现所有抽象方法,没想按想......
  • 洛谷P8539 「Wdoi-2」来自地上的支援 题解
    ST表做法思路当进行第\(x\)次操作时,若\(b_1\)到\(b_{x-1}\)中有比\(b_x\)大的数,那这次操作轮不到\(b_x\),并且前面的本来就比它大的数只会越来越大,所以以后的......
  • LeetCode 题解 | 1. 两数之和 Javascript 版
    题目给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个......
  • LeetCode 题解 | 3. 无重复字符的最长子串 Javascript
    /***@param{string}str*@returnsnumber*思路:1.start与range组合成一个窗口,窗口内的子串就是当前最长不重复的字符串*2.range每次循环递增*......
  • LeetCode 题解|6. Z 字形变换
    /***@param{string}s*@param{number}numRows*@return{string}*/varconvert=function(s,numRows){//存储结果constrows=[];//指针下一......
  • LeetCode 题解|9. 回文数
    /***@param{number}x*@return{boolean}*/varisPalindrome=function(x){if(x<0){returnfalse;}letnum=x;letreverse=0;wh......
  • LeetCode 题解|7. 整数反转
    /***@param{number}x*@return{number}*/varreverse=function(x){letres=0;while(x!=0){res=res*10+(x%10);//划重点......
  • CSP-S2022游记&几句话题解
    T1对于每一个点\(u\),计算点权最大的三个点,满足\(dis(u,v)\lek+1,dis(1,v)\lek+1\)。然后枚举\(B,C\),\(3^2\)枚举即可。复杂度\(O(n^2)\)。考场代码#inclu......