ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ABC258G————披着G题衣服的D题(bitset)

2022-07-09 08:31:32  阅读:168  来源: 互联网

标签:披着 string int ++ ABC258G bitset bs include


前言

没错今天又来更一道比较靠后的题。
不过这题其实挺水,真不明白为什么放第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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有