AT5014 Random Tournament

https://www.luogu.com.cn/problem/AT5014

感觉是经典套路题,不过不知道为啥luogu没什么人做

考虑即 L [ l ] [ r ] L[l][r] L[l][r]表示 l l l能在 [ l , r ] [l,r] [l,r]中胜出
R [ l ] [ r ] R[l][r] R[l][r]同理

考虑怎么转移
枚举一个 k ∈ [ l + 1 , r ] k\in[l+1,r] k[l+1,r]
显然如果 l l l能战胜 k k k k k k能在 [ l + 1 , r ] [l+1,r] [l+1,r]中胜出,那么 l l l就能在 [ l , r ] [l,r] [l,r]中胜出
R R R同理

用bitset优化即可

code:

#include<bits/stdc++.h>
#define N 2050
using namespace std;
int n;
bitset<N> L[N], R[N], a[N]; 
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++) {
        for(int j = 1; j < i; j ++) {
            char ch;
            scanf(" %c", &ch);
            if(ch == '1') a[i][j] = 1;
            a[j][i] = a[i][j] ^ 1; 
        }
    }

    for(int i = 1; i <= n; i ++) L[i][i] = R[i][i] = 1;
    for(int len = 2; len <= n; len ++) {
        for(int i = 1; i + len - 1 <= n; i ++) {
            int j = i + len - 1;    
            L[j][i] = (L[j] & a[i] & R[i + 1]).count() > 0;
            R[i][j] = (R[i] & a[j] & L[j - 1]).count() > 0;
        }

    }
    int ans = 0;
    for(int i = 1; i <= n; i ++) ans += (L[n][i] & R[1][i]);
    printf("%d", ans);
    return 0;
}
posted @ 2021-10-29 09:08  lahlah  阅读(25)  评论(0编辑  收藏  举报