连通三元组
2024-04-15 12:25:39
发布于:浙江
58阅读
0回复
0点赞
题意解析
我们使用 的二进制位来表示 和其他点之间是否有边。
为了方便运算,我们可以只存储编号较小的点到编号较大点的边。
当 和 固定不变时,满足条件的 的个数即 的个数,即 中 的个数。
因此,我们可以使用 std::bitset
来实现
并枚举 计算 中的 个数,总共需要 时间其中 ,因此总的时间复杂度为 。
由于 ,这个解法已经足够快了。我们只需枚举 就能进一步将执行时间减半。
AC代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
constexpr int N = 3000;
bitset<N> st[N];
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n; cin >> n;
vector<string> g(n);
for (auto &row : g) cin >> row;
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j)
if (g[i][j] == '1') st[i][j] = 1;
i64 res = 0;
for (int i = 0; i < n; ++i)
for (int j = i + 1; j + 1 < n; ++j)
if (st[i][j])
res += (st[i] & st[j]).count();
cout << res << '\n';
return 0;
}
全部评论 1
我一直以为acgo的测评机是32位的,就用bitset。ssd
2024-04-15 来自
0
有帮助,赞一个