其他分享
首页 > 其他分享> > ABC258G————披着G题衣服的D题(bitset)

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