SEERC 2018 Inversion

Posted starve

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于SEERC 2018 Inversion的主要内容,如果未能解决你的问题,请参考以下文章

2018-2019 ICPC Southeastern European Regional Programming Contest (SEERC 2018)

SEERC 2018 B. Broken Watch (CDQ分治)

2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018) Solution

gym101964G Matrix Queries seerc2018g题 数学归纳法+线段树(递归)

[2017SEERC]Divide and Conquer

好题dp+排序+贪心——SEERC 2019