boxmoe_header_banner_img

Hello! 欢迎来到DRheEheAM的blog!

加载中

文章导读

Feb. 6th 总结 | 组合数学-容斥原理


每日 Ad-hoc

P11022 「LAOI-6」Yet Another Graph Coloration Problem

我们考虑进行DFS生成树。

那么生成完后,每任意两点之间必定存在一条简单路径。
那么当此时,有一条非树边,则这个边所连的其中一个点的所有子树都存在到其他点的第二条路径。(即一条全走树边,一条走过这条非树边)

按照这个思路处理即可。

//hanser!!!!!!!
#include<bits/stdc++.h>
using namespace std;
#define intc constexpr int
#define int long long
#define Cios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
intc N=2e5+10;
int n,m,sum[N];
bool vis[N],col[N],ans;
vector <int> g[N];
void dfs (int u,int fa) {
    vis[u]=1;
    for (int v:g[u]) {
        if (v==fa) continue;
        if (vis[v]) {
            if (!ans) {
                ans=1;
                col[u]=1;
            }
        }
        else {
            dfs(v,u);
        }
    }
}
void dfscolor (int u,int cl) {
    vis[u]=1;
    col[u]=(col[u]||cl);
    for (int v:g[u]) {
        if (!vis[v]) dfscolor(v,col[u]);
    }
} 
signed main() {
    Cios;
    int T;
    cin>>T;
    while (T--) {
        cin>>n>>m;
        for (int i=1;i<=n;i++) {
            g[i].clear();
            vis[i]=0;
            col[i]=0;
            ans=0;
        }
        for (int i=1;i<=m;i++) {
            int u,v;
            cin>>u>>v;
            g[u].push_back(v);
            g[v].push_back(u);
        }
        dfs(1,0);
        bool fl=0;
        for (int i=1;i<=n;i++) {
            if (vis[i]==0||ans==0) {
                fl=1;
                cout<<"-1\n";
                break;
            }
        }
        if (fl) continue;
        for (int i=1;i<=n;i++) vis[i]=0;
        dfscolor(1,0);
        for (int i=1;i<=n;i++) cout<<"WB"[col[i]];
        cout<<"\n";
    }
    return 0;
}

容斥原理

容斥原理,小学二年级都学过

UU 中有 nn 种不同的属性,第 ii 种属性称为 PiP_i ,拥有属性 PiP_i 的几何记为 SiS_i ,则:

|i=1nSi|=m=1n(1)m1ai<ai+1|i=1mSai|\Big|\bigcup_{i=1}^nS_i\Big|=\sum_{m=1}^n(-1)^{m-1}\sum_{a_i<a_{i+1}}\Big|\bigcap_{i=1}^mS_{a_i}\Big|

P5664 [CSP-S 2019] Emiya 家今天的饭

//hanser!!!!!!!
#include<bits/stdc++.h>
using namespace std;
#define intc constexpr int
#define int long long
#define Cios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
intc N=105,M=2005,mod=998244353;
int n,m,a[N][M],sum[N],g[N][N],dp[N][2*N];
signed main() {
    Cios;
    cin>>n>>m;
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) cin>>a[i][j],(sum[i]+=a[i][j])%=mod;
    }
    g[0][0]=1;
    for (int i=1;i<=n;i++) {
        g[i][0]=g[i-1][0];
        for (int j=1;j<=n;j++) g[i][j]=(g[i-1][j]+g[i-1][j-1]*sum[i]%mod)%mod;
    }
    int res=0;
    for (int l=1;l<=m;l++) {
        memset(dp,0,sizeof dp);
        dp[0][n]=1;
         for (int i=1;i<=n;i++) {
            for (int t=n-i;t<=n+i;t++) {
                dp[i][t]=((dp[i-1][t]+dp[i-1][t+1]*(sum[i]-a[i][l]))%mod+dp[i-1][t-1]*a[i][l]%mod)%mod;
            }
        }
        for (int i=1;i<=n;i++) res=(res+dp[n][n+i])%mod;
    }
    int ans=0;
    for (int i=1;i<=n;i++) ans=(ans+g[n][i])%mod;
    cout<<(ans-res+mod)%mod;
    return 0;
}


评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码
DRheEheAM_Gary Blog