【拓扑排序】【bitset】Gym - 101128A - Promotions

给你一张DAG,若选择u点,则必须先选择所有能到达其的点。问你在选择A个点的情况下,哪些点必选;选择B个点的情况下,哪些点必选;选择B个点的情况下,哪些点一定不选。

选择A个点的情况,必选的点是那些其所能到达的点数>n-A的点。

选B个点,必选的点与前者类似。

一定不选的点,是能到达它的点数>B的点。

处理一个点所能到达的点数,要么暴力,也可以可以将边反向后,对每个点搞个bitset来做。

一个DAG反向后仍是DAG。

#include<cstdio>
#include<bitset>
#include<queue>
using namespace std;
bitset<5010>S[5010];
queue<int>q;
int first[5010],e,next[20010],v[20010],siz[5010],si2[5010];
void AddEdge(int U,int V){
	v[++e]=V;
	next[e]=first[U];
	first[U]=e;
}
int firs2[5010],e2,nex2[20010],v2[20010];
void AddEdg2(int U,int V){
	v2[++e2]=V;
	nex2[e2]=firs2[U];
	firs2[U]=e2;
}
int A,B,n,m,du[5010],du2[5010],ans1,ans2,ans3;
int main(){
	int x,y;
//	freopen("a.in","r",stdin);
	scanf("%d%d%d%d",&A,&B,&n,&m);
	for(int i=1;i<=m;++i){
		scanf("%d%d",&x,&y); ++x; ++y;
		AddEdge(x,y);
		AddEdg2(y,x);
		++du[y];
		++du2[x];
	}
	for(int i=1;i<=n;++i){
		S[i].set(i);
		if(!du2[i]){
			q.push(i);
		}
	}
	while(!q.empty()){
		int U=q.front();
		for(int i=firs2[U];i;i=nex2[i]){
			S[v2[i]]|=S[U];
			--du2[v2[i]];
			if(!du2[v2[i]]){
				q.push(v2[i]);
			}
		}
		q.pop();
	}
	for(int i=1;i<=n;++i){
		siz[i]=S[i].count();
		S[i].reset();
		S[i].set(i);
		if(!du[i]){
			q.push(i);
		}
	}
	while(!q.empty()){
		int U=q.front();
		for(int i=first[U];i;i=next[i]){
			S[v[i]]|=S[U];
			--du[v[i]];
			if(!du[v[i]]){
				q.push(v[i]);
			}
		}
		q.pop();
	}
	for(int i=1;i<=n;++i){
		si2[i]=S[i].count();
	}
	for(int i=1;i<=n;++i){
		if(siz[i]>n-A){
			++ans1;
		}
	}
	for(int i=1;i<=n;++i){
		if(siz[i]>n-B){
			++ans2;
		}
	}
	for(int i=1;i<=n;++i){
		if(si2[i]>B){
			++ans3;
		}
	}
	printf("%d\n%d\n%d\n",ans1,ans2,ans3);
	return 0;
}
时间: 2024-10-12 20:49:31

【拓扑排序】【bitset】Gym - 101128A - Promotions的相关文章

NOIP 车站分级 (luogu 1983 &amp; codevs 3294 &amp; vijos 1851) - 拓扑排序 - bitset

描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 x,则始发站.终点站之间所有级别大于等于火车站 x 的都必须停靠.(注意:起始站和终点站自然也算作事先已知需要停靠的站点)例如,下表是 5 趟车次的运行情况.其中,前 4 趟车次均满足要求,而第 5 趟车次由于停靠了 3 号火车站(2 级)却未停靠途经的 6 号火车站(亦为 2 级)而不满足要求

CH 2101 - 可达性统计 - [BFS拓扑排序+bitset状压]

题目链接:传送门 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 共N行,表示每个点能够到达的点的数量. 样例输入 10 10 3 8 2 3 2 5 5 9 5 9 2 3 3 9 4 8 2 10 4 9 样例输出 1 6 3 3 2 1 1 1 1 1 题解: 首先,如果用 $f(x)$ 代表从点 $x$ 出发所能到达的所有点的集合,应有

很好的脑洞题:dfs+暴力 Gym - 101128A Promotions

http://codeforces.com/gym/101128 题目大意:给你一个a,b,e,p.有e个点,p条有向边,每条边为(x,y),表示x->y,每次我们都取出一个入度为0的,并且一次性取出来的个数为a(或b).当然,取出来的种类可能有很多种(即一个集合),问,这个集合中有多少个数字是相同的. 第一个输出集合长度为a的,第二个输出集合长度为b的,第三个输出无论如何都无法被取出的个数. 思路:建立正向图和反向图. 定义pair<int, int> interval[i] 表示第i

[JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

设第i个人在t时刻生/死为(x,0/1,t),然后显然能够连上(x,0,t)->(x,0,t-1),(x,1,t)->(x,1,t+1),然后对于每个限制,用朴素的2-SAT连边即可. 但这样的点数达到了O(nT),其实有一种方法可以只把限制的边连接建图,点数为4m,这样可能会被卡常. 有没有更优秀的做法?当然还是有的.对于2-SAT中的边(x,y),若y在2-SAT中无出边,则x->y与x->y的后继等价,于是点数可以控制在2n+2m.然后很容易发现,生.死状态的图均为拓扑图,而

hdu-5695 Gym Class(贪心+拓扑排序)

题目链接: Gym Class Time Limit: 6000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description 众所周知,度度熊喜欢各类体育活动. 今天,它终于当上了梦寐以求的体育课老师.第一次课上,它发现一个有趣的事情.在上课之前,所有同学要排成一列, 假设最开始每个人有一个唯一的ID,从1到N,在排好队之后,每个同学会找出包括自己在内的前方所有同学的最小ID,作为

【DFS】【拓扑排序】【动态规划】Gym - 100642A - Babs&#39; Box Boutique

给你10个箱子,有长宽高,每个箱子你可以决定哪个面朝上摆.把它们摞在一起,边必须平行,上面的不能突出来,问你最多摆几个箱子. 3^10枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排序. 如果前面的宽大于等于后面的宽,就连接一条边. 形成一张DAG,拓扑排序后跑最长路即可. #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespa

2016&quot;百度之星&quot; - 初赛(Astar Round2A)Gym Class(拓扑排序)

Gym Class Accepts: 849 Submissions: 4247 Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 众所周知,度度熊喜欢各类体育活动. 今天,它终于当上了梦寐以求的体育课老师.第一次课上,它发现一个有趣的事情.在上课之前,所有同学要排成一列, 假设最开始每个人有一个唯一的ID,从1到NN,在排好队之后,每个同学会找

HDU 5695 ——Gym Class——————【贪心思想,拓扑排序】

Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 768    Accepted Submission(s): 309 Problem Description 众所周知,度度熊喜欢各类体育活动. 今天,它终于当上了梦寐以求的体育课老师.第一次课上,它发现一个有趣的事情.在上课之前,所有同学要排成一列, 假设最开始每个人有

Gym 100792 King&#39;s Rout 拓扑排序

K. King's Rout time limit per test 4.0 s memory limit per test 512 MB input standard input output standard output The great rout will be held this evening in the palace of his majesty Nassah II, the king of Occorom. There are n guests invited. While