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;
}