首页 > 其他分享 >AcWing 可达性统计(bitset

AcWing 可达性统计(bitset

时间:2023-04-12 23:25:15浏览次数:45  
标签:std idx int pos 二进制位 bitset 可达性 AcWing

可达性统计

建图 图的存储

拓扑排序:

DAG(有向无环图),往拓扑排序思考。

拓扑排序的目标是将所有节点排序,使得排在前面的节点不能依赖于排在后面的节点。

此类问题需要使用bitset优化。

bitset 在 bitset 头文件中,它类似数组,并且每一个元素只能是0或1,每个元素只用1bit空间,可看作几个int拼一起。

2进制位从右向左,bitset是从左向右,与其相反(0~2。

二进制 110

标位:2 1 0

声明

bitset<N> s;//N为长度

单点修改,时间复杂度\(O(1)\)

s[pos]=a;

bitset支持位运算,与或非,效果同int。

bitset绝大部分操作时间复杂度\(O(\frac{N}{w})\)

成员函数:

b.any()	        b中是否存在置为1的二进制位,有 返回true

b.none()	b中是否没有1,没有 返回true

b.count()	b中为1的个数

b.size()	b中二进制位的个数

b.set()	        把b中所有位都置为1

b.set(pos)	把b中pos位置置为1

b.reset()	把b中所有位都置为0,清空

b.reset(pos)	把b中pos位置置为0

b.flip()	把b中所有二进制位取反

b.flip(pos)	把b中pos位置取反

这里,bitset可以看作一个集合,1为可以到达的点,'|' 是把两个集合元素合并(默认不重复。

#include <bits/stdc++.h>

#define cin std::cin
#define cout std::cout
#define endl std::endl

namespace lcj{
const int N=3e4+10; 
int n,m,head[N],ne[N],e[N],idx,topo[N],deg[N],cnt;
std::bitset<N> f[N]; 
std::queue<int> q;
void add(int x,int y){//头插
	e[++idx]=y;
	ne[idx]=head[x];
	head[x]=idx;
}
void main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);//x→y
		deg[y]++;//入度个数
	}
	for(int i=1;i<=n;i++){//最开始入度为0的点
		if(!deg[i]) q.push(i);
	}
	while(!q.empty()){//BFS实现拓扑排序
		int h=q.front();
		q.pop();topo[++cnt]=h;
		for(int i=head[h];i;i=ne[i]){
			int v=e[i];
			deg[v]--;
			if(!deg[v]) q.push(v);
		}
	}
	for(int i=cnt;i;i--){
		int v=topo[i];
		f[v].reset();f[v][v]=1;
		for(int j=head[v];j;j=ne[j]){
			f[v]|=f[e[j]];
		}
	}
	for(int i=1;i<=n;i++){
		cout<<f[i].count()<<endl;//1的数量为可到达点的数量
	}
}

}
signed main(){
	lcj::main();
	return 0;
}

标签:std,idx,int,pos,二进制位,bitset,可达性,AcWing
From: https://www.cnblogs.com/lcj-blogs/p/17311759.html

相关文章

  • JVM:并发的可达性分析
    当前主流编程语言的垃圾收集器基本上都是依靠可达性分析算法来判定对象是否存活的,可达性分析算法理论上要求全过程都基于一个能保障一致性的快照中才能够进行分析,这意味着必须全程冻结用户线程的运行。在根节点枚举这个步骤中,由于GCRoots相比起整个Java堆中全部的对象毕竟......
  • 逆序对的数量(Acwing)
     1.首先要想到排序问题中的归并排序来解决此问题;其次我们要看逆序数的定义是i<j&&a[i]>a[j];下面就来模拟一下;1324789567 ......
  • AcWing 第 98 场周赛 ABC
    https://www.acwing.com/activity/content/competition/problem_list/3128/4947.大整数题目大意:给定n,k。输出n个k。输入样例:32输出样例:222#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAXN=1e18,MINN=-M......
  • acwing2816. 判断子序列
    linkcode#include<bits/stdc++.h>usingnamespacestd;constintN=100010;inta[N],b[N];intmain(){ intn,m; cin>>n>>m; for(inti=1;i<=n;i++)cin>>a[i]; for(inti=1;i<=m;i++)cin>>b[i]; in......
  • 区间合并 acwing803
    linkcode#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){ intn; intans=1,tpr=0; vector<pair<int,int>>v; intl,r; cin>>n; for(inti=1;i<=n;i++){ cin>>l>>r;......
  • bitset数组
    bitset的用法及例题(对DP过程的优化)  bitset这容器有点离谱,卡常优化空间神器。什么是bitset?bitset是c++STL里面的一个容器,可以理解为存放01串的,很奇怪,bool[]不也一样能实现这个功能?不是这样的,bool每个元素占一个字节,也就是8bit,而bitset中每个串中的01值每个只占一个bit!!!......
  • AcWing算法提高课-1.1.1摘花生
    题目描述HelloKitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。HelloKitty只能向东或向南走,不能向西或向北......
  • AcWing 1013. 机器分配
    总公司拥有 M 台 相同 的高效设备,准备分给下属的 N 个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。盈利与分配的设备数量有关。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数......
  • AcWing 12. 背包问题求具体方案
    有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出 字典序最小的方案。这里的字典序是指:所选物品的编号所构成的序列。物品的编号范围是 1…......
  • AcWing 1023. 买书
    小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元。问小明有多少种买书方案?(每种书可购买多本)输入格式一个整数n,代表总共钱数。输出格式一个整数,代表选择方案种数。数据范围0≤n≤1000输入样例1:20输出样例1:2输入样例2:15输出样例2:0输入样例3:0输出样例3:1......