首页 > 其他分享 >CodeForces 1062F Upgrading Cities

CodeForces 1062F Upgrading Cities

时间:2023-09-24 19:00:46浏览次数:39  
标签:typedef int Upgrading CodeForces long maxn 点数 Cities define

洛谷传送门

CF 传送门

考虑一个子问题:求从某个点 \(u\) 能到达的点数。

如果要精确地计算出来,最优解法只能是 \(O(\frac{n^2}{w})\) 的 bitset。但是我们还没有利用到题目的性质,我们只需要判断一个点是否至多有一个点互不可达

考虑拓扑排序的过程,队列里面的点两两互不可达。维护一个 \(f_u\) 表示从 \(u\) 能到达的点数。

若某个时刻队列点数 \(\ge 3\),那么这些点全寄了,不用管(也可以打标记);

若某个时刻队列点数 \(= 1\),那么队头的点可以到达剩下的所有点,直接累加。

若某个时刻队列点数 \(= 2\),设它们为 \(x, y\)。如果 \(y\) 的后继中存在一个点入度为 \(1\),那么说明它只能由 \(y\) 到达,此时给 \(x\) 打标记。如果不满足这个条件,就直接把剩下的点数累加到 \(f_x\)。

建反图再做一遍。时间复杂度 \(O(n + m)\)。

code
// Problem: F. Upgrading Cities
// Contest: Codeforces - Codeforces Round 520 (Div. 2)
// URL: https://codeforces.com/problemset/problem/1062/F
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 300100;

int n, m, f[maxn], ind[maxn];
bool vis[maxn];
vector<int> G[maxn], T[maxn];

void solve() {
	scanf("%d%d", &n, &m);
	while (m--) {
		int u, v;
		scanf("%d%d", &u, &v);
		G[u].pb(v);
		T[v].pb(u);
	}
	int cnt = 0;
	queue<int> q;
	for (int i = 1; i <= n; ++i) {
		ind[i] = (int)T[i].size();
		if (!ind[i]) {
			q.push(i);
			++cnt;
		}
	}
	while (q.size()) {
		int u = q.front();
		q.pop();
		if (q.empty()) {
			f[u] += n - cnt;
		} else if ((int)q.size() == 1) {
			bool flag = 1;
			for (int v : G[q.front()]) {
				if (ind[v] == 1) {
					flag = 0;
					break;
				}
			}
			if (flag) {
				f[u] += n - cnt;
			} else {
				vis[u] = 1;
			}
		} else {
			vis[u] = 1;
		}
		for (int v : G[u]) {
			if (!(--ind[v])) {
				q.push(v);
				++cnt;
			}
		}
	}
	cnt = 0;
	for (int i = 1; i <= n; ++i) {
		ind[i] = (int)G[i].size();
		if (!ind[i]) {
			q.push(i);
			++cnt;
		}
	}
	while (q.size()) {
		int u = q.front();
		q.pop();
		if (q.empty()) {
			f[u] += n - cnt;
		} else if ((int)q.size() == 1) {
			bool flag = 1;
			for (int v : T[q.front()]) {
				if (ind[v] == 1) {
					flag = 0;
					break;
				}
			}
			if (flag) {
				f[u] += n - cnt;
			} else {
				vis[u] = 1;
			}
		} else {
			vis[u] = 1;
		}
		for (int v : T[u]) {
			if (!(--ind[v])) {
				q.push(v);
				++cnt;
			}
		}
	}
	int ans = 0;
	for (int i = 1; i <= n; ++i) {
		ans += (!vis[i] && f[i] >= n - 2);
	}
	printf("%d\n", ans);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,int,Upgrading,CodeForces,long,maxn,点数,Cities,define
From: https://www.cnblogs.com/zltzlt-blog/p/17726428.html

相关文章

  • Codeforces 1868D. Flower-like Pseudotree
    题目链接:D-Flower-likePseudotree题目大意:给定度数数组\({d_n}\),要求构造一个\(n\)个点\(n\)条边的连通图(也就是基环树),允许有重边,但不能有自环。需要满足第\(i\)个点的度数恰好为\(d_i\),并且将环上的边全部删去后,剩下的每棵树的高度(以原先在环上的点为根)相同。首先考......
  • CodeForces 1149D Abandoning Roads
    洛谷传送门CF传送门考虑一条\(1\toi\)的路径是否在最小生成树上。称边权为\(a\)的边为轻边,边权为\(b\)的边为重边。轻边若不成环则一定在最小生成树上,因此先把轻边合并,这样形成了若干连通块。那么如果两点在一个连通块,它们只能通过轻边互达。同时,因为是树上路径,所......
  • Educational Codeforces Round 97 (Rated for Div 2) G. Death DBMS
    Problem-G-Codeforces题意给定n个字符串,每个字符串有一个值val,n次询问,每次给一个字符串,询问给定n个字符串中是询问字符串子串的值的最大值分析多模式匹配,从中找到给定串的子串,想到建立ac自动机,对于给定字符串,在自动机上面匹配时,沿fail指针向上跳并求最大值即可,由于n个字符......
  • Codeforces Round 898 (Div. 4)(A-H)
    CodeforcesRound898(Div.4)A.给abc的某个排列,问能否最多交换一次让排列变成abc直接看有几个不在原位就行查看代码#include<iostream>usingnamespacestd;voidsolve(){ chara,b,c; cin>>a>>b>>c; intans=0; if(a!='a')ans++; if(b!='b')ans++; ......
  • Tinkoff Internship Warmup Round 2018 and Codeforces Round 475 (Div. 1) D. Freque
    Problem-D-Codeforces题意给定一个字符串,n次询问,每次询问一个字符串在给定字符串的子串中出现k次时子串的最小长度分析多模式匹配,想到使用AC自动机,由于询问子串总长度不超过M=1E5,那么对于长度不同的串最多有$\sqrt{M}$,那么我们队fail树中最长的链长度小于$\sqrt{M}$,对原......
  • # [Codeforces Round 898 (Div. 4)] E. Building an Aquarium
    CodeforcesRound898(Div.4)E.BuildinganAquariumYoulovefish,that'swhyyouhavedecidedtobuildanaquarium.Youhaveapieceofcoralmadeof\(n\)columns,the\(i\)-thofwhichis\(ai\)unitstall.Afterwards,youwillbuildat......
  • Codeforces Round 898 (Div. 4)
    CodeforcesRound898(Div.4)A.ShortSort解题思路:遍历所有交换情况,看是否有\(abc\).代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=1e6+10;constintM=2*M;typedefpair<int,int>pii;#definefifirst#define......
  • Educational Codeforces Round 123 - D(思维题)
    目录D.CrossColoringD.CrossColoring题意$n\timesm$的方格纸上进行q次操作,每次操作选择某整行x和某整列y,使得行x和列y均涂上k种颜色中的一种。问你最终的方案数思路倒序考虑操作,因为对于同一行或者同一列,后面的操作覆盖前面的操作利用数组标记某行或者某......
  • Educational Codeforces Round 154 (Rated for Div. 2) A-D
    传送门:edu154/div2A.PrimeDeletion题意:给定一个0-9的排列,要求一个长度>=2的子序列,使得该子序列是质数做法:考虑31或者13即可。不过当时没有立刻想到,感觉1000以内的质数必有答案,打了暴力。用时就多了点。Code#include<bits/stdc++.h>usingnamespacestd;intpri[10......
  • Educational Codeforces Round 143
    A.TwoTowers#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definempmake_pairusingpii=pair<int,int>;usingvi=vector<int>;constexprintinf=1e18;voidsolve(){intn,m,cnt=0;stringa,......