社区讨论

求助,luogu 100,oitiku 0。

P7113[NOIP2020] 排水系统参与者 5已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@locul7uo
此快照首次捕获于
2023/10/30 19:59
2 年前
此快照最后确认于
2023/11/05 06:34
2 年前
查看原帖
代码如下
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#define int __int128
#define s1e6 1000100
using namespace std;
int n, m;
int head[s1e6];
int pre[s1e6], pos[s1e6];
int num, cnt, cnt2;
inline int read()
{
	int num = 0; char c = getchar();
	while (c < 48 || c>57)c = getchar();
	while (c >= 48 && c <= 57)num = num * 10 + (c ^ 48), c = getchar();
	return num;
}
struct node {
	int nx, to;
}e[2 * s1e6];
struct nd {
	int p, q;
}wt[s1e6];
int in[s1e6], ou[s1e6];
inline void add(int nx, int to)
{
	e[++num].to = to;
	e[num].nx = head[nx];
	head[nx] = num;
}
inline void write(__int128 x)
{
	if (x < 0)
	{
		putchar('-');
		x = -x;
	}
	if (x > 9)
		write(x / 10);
	putchar(x % 10 + '0');
}
inline int gcd(int a, int b)
{
	if (b > a)swap(a, b);
	if (b == 0)return a;
	return gcd(b, a % b);
}
inline int lcm(int a, int b)
{
	return a / gcd(a, b) * b;
}
signed main()
{
	ios::sync_with_stdio(0);
	n = read(), m = read();
	freopen("water.in", "r", stdin);
	freopen("water.out", "w", stdout);
	for (int i = 1; i <= n; i++)
	{
		int t;
		t = read();
		if (t)
		{
			while (t--)
			{
				int y; y = read();
				add(i, y);
				pre[y]++; pos[i]++;
			}
		}
	}
	for (int i = 1; i <= n; i++)
	{
		if (!pos[i])ou[++cnt2] = i;
		if (!pre[i])in[++cnt] = i;
	}
	for (int i = 1; i <= m; i++)
	{
		wt[in[i]].p = 1; wt[in[i]].q = 1;
		queue<int>q;
		q.push(in[i]);
		while (!q.empty())
		{
			int u = q.front(); q.pop();
			for (int i = head[u]; i; i = e[i].nx)
			{
				int v = e[i].to;

				if (!wt[v].q && !wt[v].p)wt[v].p = wt[u].p, wt[v].q = wt[u].q * pos[u];
				else
				{
					wt[v].p = wt[v].p * (lcm(wt[u].q * pos[u], wt[v].q) / wt[v].q) + wt[u].p * (lcm(wt[u].q * pos[u], wt[v].q) / (wt[u].q * pos[u]));
					wt[v].q = lcm(wt[v].q, wt[u].q * pos[u]);
					int x = gcd(wt[v].p, wt[v].q);
					wt[v].p /= x;
					wt[v].q /= x;
				}
				q.push(v);
			}
			if (pos[u])wt[u].p = 0, wt[u].q = 1;
		}

	}
	for (int j = 1; j <= cnt2; j++) { write(wt[ou[j]].p); putchar(' '); write(wt[ou[j]].q); puts(""); }
	return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...