SEERC 2018 Inversion

题意:

如果p数组中 下标i<j且pi>pj 那么点i j之间存在一条边

现在已经知道边,然后求p数组

在一张图中,求有多少个点集,使得这个点集里面的任意两点没有边

不在点集里面的点至少有一条边连向点集中一点

思路:

我们考虑一条边 (i,j)(i,j)(i,j)那么定义在一个序列中(i,j)为一个逆序对

那么就是找上升子序列的个数

#include<bits/stdc++.h>
using namespace std;
const int M=120;
typedef long long ll;
int g[M][M];
ll dp[M];
inline int read(){
    int sum=0,x=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            x=0;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
        sum=(sum<<1)+(sum<<3)+(ch^48),ch=getchar();
    return x?sum:-sum;
}
inline void write(ll x){
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
}

int main(){
    int n=read(),m=read();
    while(m--){
        int u=read(),v=read();
        g[u][v]=1;
        g[v][u]=1;
    }
    dp[0]=1;
    for(int i=1;i<=n+1;i++){
        for(int j=0;j<i;j++){
            if(g[i][j])//存在逆序 
                continue;
            int fuck=1;
            for(int p=j+1;p<i;p++){
                if(g[i][p]||g[j][p])//存在逆序 
                    continue;
                else{
                    fuck=0;
                    break;
                }
            }
            dp[i]+=fuck*dp[j];
        }
    }
    write(dp[n+1]);
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/starve/p/11622086.html
今日推荐