首页 > 其他分享 >Atcoder Grand Contest 041 F - Histogram Rooks

Atcoder Grand Contest 041 F - Histogram Rooks

时间:2024-02-10 15:11:23浏览次数:27  
标签:Atcoder Rooks 格子 Contest 方案 容斥 一行 系数 属于

考虑容斥。我们钦定一些格子组成的集合不能被覆盖,设为 \(A\)。把与 \(A\) 中的点同行同列的点抠掉,剩余的点则是可放可不放的,总方案数就是 \(2^{\text{剩余点的个数}}\),乘以 \((-1)^{|A|}\) 并求和即可。

这个做法直接优化显然不行。我们考虑设 \(A\) 中的点所在的列组成的不可重集为 \(S\),我们枚举 \(S\) 是什么,那么考虑每一个行连续段计算方案数,分两种情况讨论:

  • 这一行里没有任何属于 \(A\) 的格子,那么设 \(c\) 为这一行中不属于 \(S\) 的列的个数,那么这种方案的容斥系数乘以方案数就是 \(2^c\)。
  • 这一行有至少一个格子属于 \(A\),那么枚举这一行中属于 \(A\) 的格子的数量 \(d\),容斥系数 \((-1)^d\),方案数 \(\dbinom{c}{d}\),把它们求和可以得到 \(\sum\limits_{d=1}^c\dbinom{c}{d}(-1)^d\),其值为 \(-[c>0]\)。

两者加起来就是这一行的方案数。

但是这个做法有一个问题,就是我们不能保证 \(S\) 中每一列都有至少一个格子属于 \(A\)。

考虑再进行一层容斥。枚举集合 \(T\) 满足 \(T\subseteq S\) 且 \(T\) 中的列都没有属于 \(A\) 的格子,那容斥系数自然是 \((-1)^{|T|}\),这样每一行的方案数也要进行相应的改变:

  • 这一行里没有任何属于 \(A\) 的格子,那么设 \(c\) 为这一行中不属于 \(S\) 的列的个数,那么这种方案的容斥系数乘以方案数就是 \(2^c\)。
  • 这一行有至少一个格子属于 \(A\),设 \(c'\) 为这一行中属于 \(S\) 但不属于 \(T\) 的列的个数,那么类比之前的过程可知方案数为 \(-[c'>0]\)。

而我们发现,这个棋盘实际上可以被看作笛卡尔树的形状。即,对于每一个行连续段,它对应的列实际上是笛卡尔树上一个区间。因此考虑对 \(h\) 建笛卡尔树,然后设 \(dp_{i,j,0/1}\) 表示 \(i\) 子树内有 \(j\) 个属于 \(S\) 的列,是/否有属于 \(S\) 但不属于列的所有 \((S,T)\) 的方案数乘以容斥系数之和。转移是背包合并,总复杂度就是 \(O(n^2)\)。

标签:Atcoder,Rooks,格子,Contest,方案,容斥,一行,系数,属于
From: https://www.cnblogs.com/tzcwk/p/18012878/agc041f

相关文章

  • AtCoder ABC 263 D 题解
    AtCoderABC263D题解前言本蒟蒻的第一篇题解,大佬勿喷QwQ传送门们洛谷传送门AtCoder传送门正文设有\(x\)使得\(x\leqk\)时,令\(f(k)\)为对\(A'\)进行运算后\(A'=(A_1,A_2,\ldots,A_k)\)的最小和。同理,对于\(y\)使得\(y\leqk\)时,令\(g(k)\)为对\(A......
  • AtCoder Beginner Contest 339 A-G
    A模拟即可voidsolve(){strings;cin>>s;for(inti=s.size()-1;i>=0;i--)if(s[i]=='.'){cout<<s.substr(i+1)<<endl;return;}}B模拟,可以让下标从0开始,这样......
  • [AGC041F] Histogram Rooks 题解
    题目链接点击打开链接题目解法好牛(难)的题!!!所有都被覆盖不难想到容斥暴力的容斥是钦定集合\(S\)中的位置都没被覆盖,然后把不能填棋子的点都去掉,假设剩下的不受限制的点的个数为\(c\),则答案为\(\sum2^c(-1)^{|S|}\)这个暴力是很难直接优化的如果一列被有点被钦定了,那么......
  • AtCoder-ABC-Ex乱写
    ABC233ExManhattanChristmasTree先将\((x,y)\)变成\((x+y,x-y)\),也就是曼哈顿转切比雪夫,之后曼哈顿距离\(\lek\)的在切比雪夫坐标系下就是一个正方形。用主席树做矩形和,外层套一个二分即可,时间复杂度\(\mathcal{O}(n\log^2n)\)。ABC233Ex#include<bits/stdc++.h......
  • 我也要板刷 AtCoder!
    板刷AtCoderARCC![ARC171C]SwaponTreeProblem给定一棵\(n\)个节点的树,每个点有个权值\(a_i\),初始时\(a_i=i\)。你可以执行任意操作:选择一条边\((u,v)\),交换\(a_u\)和\(a_v\),并将这条边删掉。问通过上述操作,最后\((a_1,a_2,\cdots,a_n)\)有多少种不同的排列方......
  • AtCoder Beginner Contest 339
    AtCoderBeginnerContest339A-TLD签到B-Langton'sTakahashi发现步数和网格范围都不大,直接模拟即可C-PerfectBus题目的合法性在于不能为负数,那么初始人数就有了二分性。二分的找出初始的最小人数,然后跑一边即可#include<bits/stdc++.h>usingnamespacestd;#d......
  • Japan Registry Services (JPRS) Programming Contest 2024 (AtCoder Beginner Contes
    JapanRegistryServices(JPRS)ProgrammingContest2024(AtCoderBeginnerContest339)A-TLD代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__......
  • AtCoder Beginner Contest 339
    A找到最后一个点的位置,使用substr函数。B模拟,记得边界是循环的。C容易发现答案为:\[\min_p(\sum_{i=1}^{p}a_i)+\sum_{i=1}^{n}a_i\]D由于不同状态数只有\(60^4\),容易搜索,但是我去吃饭了,所以没能快速切掉。E有一个显然的dp,然后考虑每一个\(a_i\)可以转移到\(a_j\)......
  • 2019-2020 ICPC Northwestern European Regional Programming Contest (NWERC 2019)
    Preface由于前两天疑似感染风寒,今天头痛+鼻塞+咽炎一条龙,硬打了4h顶不住就下班了最后过了8个题也还行,比较可惜的就是H题从中期写到结束,祁神和徐神各写了一个version也没过A.AverageRank挺有意思的一个题考虑将一个原来分数为\(x\)的人加\(1\)分后会发生什么,显然只有原来分......
  • AtCoder Beginner Contest 330
    A-CountingPasses#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingvi=vector<int>;usingi32=int32_t;usingpii=pair<int,int>;#definempmake_pairconstintinf=1e9;i32main(){intn,l;......