zoukankan      html  css  js  c++  java
  • [atAGC056F]Degree Sequence in DFS Order

    (以下图默认均为$n$个点$,m$条边$,$无自环的无向连通图)

    注意到点编号并没有意义,不妨强制dfs序为$\{1,2,...,n\}$,那么$\{a_{i}\}$合法等价于存在图$G$使得点$i$的度数为$a_{i}$且存在一种dfs序为$\{1,2,...,n\}$

    称满足后者的图为"好图",称$\forall i\in [2,n]$存在$j\in [1,i)$与$i$相邻的图为"半好图",显然"好图"总是"半好图"

    结论1:对于半好图$G$,存在好图$G'$使得$G$与$G'$所有点度数均相同

    对于$G$中$1\le a<b<c<d\le n$使得$(a,c),(b,d)\in E$,不妨删除$(a,c)$和$(b,d)$并加入$(a,d)$和$(b,c)$,重复此过程直至不存在这样的$a,b,c$和$d$

    考虑$\sum_{(x,y)\in E}(y-x)^{2}$,注意到每次操作后该值单调递增且有$mn^{2}$这个上界,因此过程有限

    对于最终得到的图为$G'$,不难证明其符合条件,即得证

    换言之,不妨将$\{a_{i}\}$合法的条件中"$G$为好图"改为"$G$为半好图"

    结论2:$\{a_{i}\}$合法当且仅当满足以下条件:

    1.$\forall i\in [1,n],a_{i}\in Z^{+}$且$\sum_{i=1}^{n}a_{i}=2m$

    2.$a_{1}\le m$且$\forall i\in [2,n],a_{i}\le m-(i-2)$

    3.$\forall i\in [0,n),\sum_{j=1}^{i}a_{j}\ge 2i-1$

    必要性:

    1.关于第1个条件,两者均显然成立(前者对$i$是否为1分类讨论即可)

    2.关于第2个条件,$[2,i)$这些点均要"向前"连一条边,进而$i$至多连$m-(i-2)$条边

    另外,由于没有自环,显然有$a_{1}\le m$(上式仅得到$a_{1}\le m+1$)

    3.关于第3个条件,$[1,i]$这些点内部有$2(i-1)$条边且$i+1$至少再连一条边,进而度数和$\ge 2i-1$

    充分性:

    对于$i\in [2,n]$,依次选择当前最大的$a_{j}$(其中$j\in [1,i)$,多个任选)并连边$(i,j)$(将$a_{i}$和$a_{j}$均减1)

    此时即保证是"半好图",进而仅需要保证$a_{i}\in [0,m']$且$\sum_{i=1}^{n}a_{i}=2m'$(其中$m'$为剩余边数)

    1.对于$a_{i}\ge 0$,也即每一次$a_{i},a_{j}\ge 1$,$a_{i}$是第一次操作根据$a_{i}\in Z^{+}$显然,若$a_{j}=0$即$\sum_{j=1}^{i-1}a_{j}=0$,由于之前已经选了$i-1$条边,可得初始$\sum_{j=1}^{i-1}a_{j}\le 2i-2$,与3矛盾

    2.对于$a_{i}\le m'$,若存在$a_{j}>m'$,则在$i\in (j,n]$时必然都选该$a_{j}$(若还操作过$k$,最终$a_{k}\ge a_{j}-1$,那么$a_{j}+a_{k}>2m'$与3矛盾),而其仍然$>m'$,与2矛盾

    3.对于$\sum_{i=1}^{n}a_{i}=2m'$,根据初始$\sum_{i=1}^{n}a_{i}=2m$显然成立

    进一步的,构造$b_{i}=\begin{cases}a_{1}&(i=0)\\a_{i+1}-1&(1\le i<n)\end{cases}$

    对于$b_{i}$而言,结论2中的条件即等价于:

    1.$\forall i\in [0,n),b_{i}\in N$且$\sum_{i=0}^{n-1}b_{i}=2m-(n-1)$

    2.$\forall i\in [0,n),b_{i}\le m-i$

    3.$\forall i\in [0,n),\sum_{j=0}^{i-1}b_{j}\ge i$

    (关于$b_{0}=a_{1}\in Z^{+}$的条件已经在3中保证)

    结论3:在保证第1和3个条件的基础上,至多存在一个$i$不满足第2个条件

    反证法,若存在$x<y$均不满足,则$x\le \sum_{j=0}^{x-1}b_{j}\le \sum_{i=0}^{n-1}b_{i}-b_{x}-b_{y}\le x+y-n-1$,再移项后即$y\ge n+1$,矛盾

    换言之,先忽略第2个条件,再枚举对应的$i$减去不满足第2个条件的方案

    关于前半部分,即求$(0,0)\rightarrow (n-1,2m-(n-1))$(仅能向上或向右)且不经过$y<x$的路径数

    类似卡特兰数的推导,将第一处经过后的部分沿$y=x-1$​翻折,翻折后的终点即$(2m-(n-2),n-2)$,经过该处必然经过$y<x$,因此答案为${2m\choose n-1}-{2m\choose n-2}$

    关于后半部分,将$b_{i}$减去$m-i+1$,第1个条件变为$\sum_{i=0}^{n-1}b_{i}=m-n+i$,且$i$之后第3个条件必然成立

    特判$i=0$的情况,此时答案显然为${m-1\choose n-1}$

    对于$i\ge 1$的情况,考虑路径中第一次经过$(*,i)$的位置,并枚举第一维$k\in [0,i)$,之后的路径即没有限制,结合前者对应答案即为$\left({k+i-1\choose k}-{k+i-1\choose k-1}\right){m-k-1\choose m-n}$

    调换两者枚举顺序,右式与$i$无关,左式根据$\sum_{i=l}^{r}{i\choose k}={r+1\choose k+1}-{l\choose k+1}$可以$o(1)$计算

    时间复杂度为$o(m)$,可以通过

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define N 2000005
     4 #define mod 998244353
     5 #define ll long long
     6 int n,m,ans,fac[N],inv[N];
     7 int C(int n,int m){
     8     if ((m<0)||(n<m))return 0;
     9     return (ll)fac[n]*inv[m]%mod*inv[n-m]%mod;
    10 }
    11 int main(){
    12     scanf("%d%d",&n,&m);
    13     fac[0]=inv[0]=inv[1]=1;
    14     for(int i=1;i<N;i++)fac[i]=(ll)fac[i-1]*i%mod;
    15     for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
    16     for(int i=1;i<N;i++)inv[i]=(ll)inv[i-1]*inv[i]%mod;
    17     ans=(C((m<<1),n-1)-C((m<<1),n-2)+mod)%mod;
    18     ans=(ans-C(m-1,n-1)+mod)%mod;
    19     for(int k=0;k<n;k++){
    20         int s=(C(k+n-1,k+1)-C((k<<1),k+1)+mod)%mod;
    21         s=(s-(C(k+n-1,k)-C((k<<1),k)+mod)%mod)%mod;
    22         ans=(ans-(ll)s*C(m-k-1,m-n)%mod+mod)%mod;
    23     }
    24     printf("%d\n",ans);
    25     return 0;
    26 } 
    View Code
  • 相关阅读:
    HDU 4069 Squiggly Sudoku
    SPOJ 1771 Yet Another NQueen Problem
    POJ 3469 Dual Core CPU
    CF 118E Bertown roads
    URAL 1664 Pipeline Transportation
    POJ 3076 Sudoku
    UVA 10330 Power Transmission
    HDU 1426 Sudoku Killer
    POJ 3074 Sudoku
    HDU 3315 My Brute
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/15677495.html
Copyright © 2011-2022 走看看