首页 > 其他分享 >CodeTON Round 2 (Div. 1 + Div. 2) - E. Count Seconds

CodeTON Round 2 (Div. 1 + Div. 2) - E. Count Seconds

时间:2022-09-22 18:44:29浏览次数:75  
标签:Count return Seconds ll tot int Div include

思维 + DP

[Problem - E - Codeforces](https://codeforces.com/contest/1695/problem/D2)

题意

给一张有 \(n\) 个结点 \(m\) 条有向边的有向无环图,\(1<=n,m<=1000\), 每个点初始有 \(a_i\) 个物品,对于每条边 \(u->v_i\), 如果 \(u\) 上有货物,将会往每个 \(v_i\) 传递一个, u 的货物再减少一个,即 当\(a_u>0\) 时, \(a_{v_i}++\), \(a_u--\)

这张图有且仅有一个汇点,求多少秒后每个点都没有货物

思路

  1. 如果能求出最终 tot 个物品可以流到汇点 T,那么时间一定 >= T, 因为 T 并非一直都在流出,有某些时间可能在等待流入
  2. tot 可按拓扑排序dp, 设 \(f[u]\) 为流过 u 的物品数,则在拓扑排序中执行 \(f[v]+=f[u]\) ,汇点的 \(f\) 即为 tot
  3. 考虑在什么情况下 tot == 总时间:第一个离汇点 T 最远的点的物品能流到 T 后,之后肯定是源源不断的向 T 流入
  4. 因此只需要模拟前 n 秒,之后 dp 求出 tot,n + tot 即为答案

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;
#define endl "\n"

typedef long long ll;
typedef pair<int, int> PII;

const int N = 1e3 + 10, mod = 998244353;
int n, m;
int din[N];
ll a[N], tmp[N];
ll f[N];
vector<vector<int> > G(N);

void add(int u, int v)
{
	G[u].push_back(v);
	din[v]++;
}
bool check()
{
	for (int i = 1; i <= n; i++)
		if (a[i] > 0)
			return false;
	return true;
}
ll solve()
{
	if (check())
		return 0;
	for (int t = 1; t <= n; t++)
	{
		for (int u = 1; u <= n; u++)
			tmp[u] = a[u];
		for (int u = 1; u <= n; u++)
		{
			if (a[u] == 0)
				continue;
			tmp[u]--;
			for (int v : G[u])
				tmp[v]++;
		}
		for (int u = 1; u <= n; u++)
			a[u] = tmp[u];
		if (check())
			return t;
	}
	for (int i = 1; i <= n; i++)
		f[i] = a[i] % mod;
	queue<int> q;
	for (int i = 1; i <= n; i++)
		if (!din[i]) q.push(i);
	int t;
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		t = u;
		for (int v : G[u])
		{
			f[v] = (f[v] + f[u]) % mod;
			din[v]--;
			if (!din[v])
				q.push(v);
		}
	}
	ll ans = (f[t] + n) % mod;
	return ans;
}

void init()
{
	fill(din, din + n + 2, 0);
	for (int i = 1; i <= n; i++)
		G[i].clear();
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T;
	cin >> T;
	while(T--)
	{
		cin >> n >> m;
		for (int i = 1; i <= n; i++)
			cin >> a[i];
		init();
		for (int i = 1; i <= m; i++)
		{
			int u, v;
			cin >> u >> v;
			add(u, v);
		}
		cout << solve() << endl;
	}
    return 0;
}

标签:Count,return,Seconds,ll,tot,int,Div,include
From: https://www.cnblogs.com/hzy717zsy/p/16720487.html

相关文章

  • Codeforces Round #298 (Div. 2) - D. Handshakes
    贪心+构造题意有\(n(1<=n<=2*10^5)\)个人,每分钟有一个人进入房间,房间里任意3个人可以组队开始工作并一直持续下去,且只要房间里至少有3个人,他们就可以在任意时间......
  • [AAAI 2022]Graph Convolutional Networks with Dual Message Passing for Subgraph I
    总结GNN实现子图匹配。利用线图(边变点)让模型训练时将点和边的特征反复映射到对方领域参与训练。定义常规符号Graph,Edge,Vertex,。X,Y表示点标签和边标签:\(\mathca......
  • CSS带小三角形的div框
    效果图:<spanclass="hint_prompt">超时20天</span>.hint_prompt{border:1pxsolid#fff1f0;border-radius:4px;margin:50px;text-align:center;bor......
  • Java并发编程解析 | 基于JDK源码解析Java领域中并发锁之同步器Semaphore,CyclicBarrier
    苍穹之边,浩瀚之挚,眰恦之美;悟心悟性,善始善终,惟善惟道!——朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享......
  • Codeforces Round #813 (Div. 2) - D. Empty Graph
    构造Problem-D-Codeforces题意给\(n(1<=n<=10^5)\)个点,与权值\(a_i\),这\(n\)个点组成一个完全图,\(a_l\)与\(a_r\)连的边的权值为\(min(a_l,a_{l+1}...a_{r......
  • Codeforces Round #821 (Div. 2) D E
    E首先发现无论何时,每个位置上至多只会有一个球。原因:每个时刻每个球都会移动,所以移动到某个点的时间一定,自然出生时间也一定,显然不可能会有2个点出生时间相同。既然如......
  • 监听div高度宽度的变化-自定义指令
    上篇内容说到,iframe嵌入其他项目页面,iframe实现自适应高度需要监听div页面高度的变化使用到了局部自定义指定directives:{//使用局部注册指令的方式resize:{//......
  • Codeforces Round #818 (Div. 2) - D. Madoka and The Corruption Scheme
    思维+组合数学Problem-D-Codeforces题意有\(2^n\)个人进行锦标赛,编号1~\(2^n\),每一场输的人失去比赛资格,赢的人继续。Madoka可以选择他们进行的顺序,以及决定哪一......
  • IfcDimensionCount
    IfcDimensionCount类型定义IfcDimensionCount定义坐标空间的维度。在本规范中,尺寸限制为1、2或3。 注:分配给几何表示上下文的形状表示可能包括低维度的几何表示项目,特......
  • 在 CSS 中使 div 居中的 5 种方法
    在CSS中使div居中的5种方法5waystocenteradivinCSS你觉得很难在CSS中将div居中吗?你并不孤单,我的兄弟,许多开发人员有时会在将div居中时感到困惑,包括......