首页 > 其他分享 >Codeforces 1740 F Conditional Mix 题解

Codeforces 1740 F Conditional Mix 题解

时间:2022-11-20 19:58:58浏览次数:71  
标签:所有 题解 复杂度 Conditional 合法 Mix lim multiset define

题目链接

对于任意一个multiset,我们都把它的元素从大到小排序来观察。发现一个multiset合法有个必要条件:对于每个i,multiset中最大的i个元素之和不能超过\(lim_i\),如果令\(c_i\)表示输入的数中i出现的次数,则\(lim_i=\sum_{j=1}^n min(i,c_j)\)。根据题意,很容易发现不符合这个条件的multiset一定是不合法的。

其实这个条件也是充分的。证明也不难,假设一个合法的multiset中有某两个数,一大一小,那么肯定可以从大的那个数中拿出1,加到小的里面,使得multiset仍然合法,我们称这个操作为"调整"。根据题意,一定存在一个合法的multiset满足对于所有i,这个multiset中最大的i个数之和=\(lim_i\),也就是刚好卡着所有限制。那么所有满足上面条件的multiset一定能由这个卡着所有限制的multiset调整而来,所以它们全部合法。

接下来就是对满足这个条件的multiset计数了。先把所有的\(lim_i\)计算出来,时间复杂度\(O(n^2)\)。从大往小向multiset中填数,令\(dp_{i,j,k}\)表示填了i个数,当前所有数的和是j,其中第i个数的值为k的方案数。接下来填的数不能大于k,且所有数的和不能超过\(lim_{i+1}\)。发现对于固定的i,只有\(k \le \lfloor \frac ni \rfloor\)的状态才是合法的,所以合法状态总数是\(O(n^2logn)\)的。把i这一维滚动掉就可以做到\(n^2\)的空间复杂度。转移可以用前缀和优化到\(O(1)\)。

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

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define fi first
#define se second
#define mpr make_pair
#define pb push_back

void fileio()
{
  #ifdef LGS
  freopen("in.txt","r",stdin);
  freopen("out.txt","w",stdout);
  #endif
}
void termin()
{
  #ifdef LGS
  std::cout<<"\n\nPROGRAM TERMINATED";
  #endif
  exit(0);
}

using namespace std;

const LL MOD=998244353;

LL n,a[2010],cnt[2010],lim[2010],dp[2][2010][2010];

int main()
{
  fileio();

  cin>>n;
  rep(i,n)
  {
    cin>>a[i];
    ++cnt[a[i]];
  }
  repn(i,n) repn(j,n) lim[i]+=(cnt[j]<=i ? cnt[j]:i);
  dp[0][0][n]=1;
  rep(ii,n)
  {
    int i=ii&1,kmx=(ii==0 ? n:n/ii);
    rep(j,n+1)
    {
      LL val=0;
      for(int k=kmx;k>=0;--k)
      {
        (val+=dp[i][j][k])%=MOD;
        if(j+k<=lim[ii+1]) (dp[i^1][j+k][k]+=val)%=MOD;
        dp[i][j][k]=0;
      }
    }
  }
  LL ans=0;
  rep(i,n+1) (ans+=dp[n&1][n][i])%=MOD;
  cout<<ans<<endl;

  termin();
}

标签:所有,题解,复杂度,Conditional,合法,Mix,lim,multiset,define
From: https://www.cnblogs.com/legendstane/p/codeforces-1740-f-conditional-mix-solution.html

相关文章

  • 2022/11/20 集训题解 Longest Loose Segment
    linkDescription定义\(a_{1,2,...,m}\)为好序列当且仅当\(\maxa_i+\mina_i>m\),给出一个长度为\(n\)的序列,问最长好序列子段长度。有\(T\)次修改。\(n\le10^6,......
  • P4047 [JSOI2010]部落划分 题解
    最小生成树做法之Kruskal算法流程(详细分析请看代码注释):1.初始化并查集并查集模板不过多解释,还不懂请参阅并查集-OIWiki。每个节点的祖先最开始都是自己。还有......
  • U255813 争宠题解
    题目传送门#include<bits/stdc++.h>usingnamespacestd;voidjia(strings1,strings2){boolaaa=0;inta[5010],b[5010],c[5010];memset(a,0,sizeof(......
  • 《Consequentialist Conditional Cooperation in Social Dilemmas with Imperfect Inf
    环境:Fishery:湖两岸有两个钓鱼人互相观察不到对方的动作,湖里有幼鱼和成熟鱼奖励分别为1和2,鱼游到对岸变成成熟鱼。合作方案即将幼鱼放给对岸,背叛即被诱惑吊幼鱼。PongPl......
  • Git reset 的hard、soft、mixed参数对比
    目录分区概念1.--soft参数2.--mixed参数3.--hard参数分区概念先要清楚在本地,git会分三个区:工作区、暂存区、本地库。当使用去做版本移动的时候,那么在使用【--hard】......
  • AtCoder Beginner Contest 278题解
    A-Shift题意给一个长度为\(n\)的数组,有\(k\)次操作,每次操作会将数组最前面的元素删掉,再在数组最后面加上一个0元素,问\(k\)次操作后的数组中的数字。思路看\(n\)与\(k......
  • Codeforces 704 B Antman 题解 (dp,贪心,结论)
    题目链接这题两种不同做法,普通的\(O(n^2)\)和奇怪的\(O(nlogn)\)。如果用\(O(nlogn)\)的话可以加强到1e6。做法1时间复杂度\(O(n^2)\)先把最终的排列随便画一个出来观......
  • C. Sum of Substrings题解
    C.SumofSubstrings题目大概意思,给你一个01串,求和最小,其中和是该串所有相邻字符所组成的十进制数的和。如:0110,sum=01+11+10=22。通过观察我们可以发现,除了第......
  • cf796部分题解
    C.ManipulatingHistory题意:给出一些字符串,有原始串(只含一个字符的串)、被替换的串、替换串、最终串(最后一行),求原始串。2aabbcdacdInitiallysis"a".Inthe......
  • B - Bracket Sequence题解
    B-BracketSequence思路:用一个flag来标记括号的数目,如果括号数目是个偶数的话,就代表当前要执行'+'操作,反之就是'*'操作。对于最外层的数,是没有计算的。所以最后要单独......