ABC258G————披着G题衣服的D题(bitset)
作者:互联网
前言
没错今天又来更一道比较靠后的题。
不过这题其实挺水,真不明白为什么放第7个。
题意
有一个图,你需要统计这个图中,以某些节点为顶点的三角形有多少个。
(好简短的题意啊)
思路
Level 1
从暴力枚举入手。
枚举三个节点,看他们是不是相互连接。
可是,暴力是 $ O(n^3) $ 的,这……咋办?
提示:bitset
这关有需要可以使用百度。
Level 2
没错!bitset优化!
现在我给大家讲讲bitset里的函数!
const int N = 4;
bitset<N> bs; // 定义一个N位二进制数
bitset<N> bs(v) // 定义一个N位二进制数,初始值为v
bitset<N> bs(s) // s是01串,定义一个N位二进制数,初始值为s对应的二进制数
/**************************/
bitset<N> a(string("1101"));
bitset<N> b(string("0011"));
cout << a & b; // 0001
cout << a | b; // 1111
cout << a ^ b; // 1110
cout << ~a; // 0010
cout << a == b; // false(0)
cout << a != b; // true(1)
/**************************/
bitset<N> bs(string("1010"));
// 注意!数组是反着存的,所以bs[0] = 0,bs[1] = 1!
/**************************/
bs.count(); // 求bs中1的个数
应该够用了吧!
我们今天用的就是a & b和bs.count()。
枚举两个,然后把它们的数组进行与运算,算多少个1就行了。
(略显生草)
Level Boss
#include <bitset>
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
bitset<3005> G[3005];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
for (int j = i + 1; j < n; j++) {
G[i][j] = s[j] - '0';
}
}
long long ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (G[i][j]) {
ans += (G[i] & G[j]).count();
}
}
}
cout << ans;
return 0;
}
再见!
标签:披着,string,int,++,ABC258G,bitset,bs,include 来源: https://www.cnblogs.com/AProblemSolver/p/16460090.html