社区讨论
求助,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 条回复,欢迎继续交流。
正在加载回复...