NOIP 2020 T1 排水系统

NOIP 帝国反击战

昨天才考完CSP-S 2021 的第二轮,人已经不行了。

差一点就爆零了。只有T1 暴力(都不配叫暴力)有20分。

下一轮等到11月20号的NOIP了。

**从现在开始,冲锋的号角吹响了!!**

兄弟们冲冲冲!!!

今天先来打一个NOIP2020 T1 的题解,考复赛前一天晚上用两个小时干出来了。

先分析题意:从每一个入度为零的节点灌水,然后看每一个出度为零的节点排出了多少的污水。一看到这题目,我们就明白要用拓扑排序来做。

但是又有一个分数计算的问题。接下来就讲解一下蒟蒻的解题思路。

 

1:首先是一个拓扑排序的模板套上去,统计入度为零的点依次进入队列,然后再一次减去与他们相连的点的入度。最后排序

2:分数的运算,开一个结构体,两个整数一个记录分子,一个记录分母。每次运算的时候分子分母分开处理,小学数学~~~重点是,在每次通分的时候,如果直接把分母相乘会爆long long 所以在找gcd的同时求出lcm,用lcm来通分就不会爆了。还有!!遍历到一个点时,如果这个点没有被访问过,不要运算,直接加上上一个节点的值除以该节点的出度。不然,RE了解一下。

放代码:

#include<bits/stdc++.h>
#define int __int128
using namespace std;
int n,m;
inline int read()
{
	static char ch;
	int res=0;
	while((ch=getchar())<'0'||ch>'9'){
	}
	res=ch-'0';
	while((ch=getchar())>='0'&&ch<='9'){
		res=res*10+ch-'0';
	}
	return res;
}
const int N=200100;
struct node{
	int p,q;
}c[N];
vector<int> e[N];
queue<int> q;
int out[N];
int vis[N];
int de[N];
int _gcd(int a,int b){
	if(b==0){
		return a;
	}
	return _gcd(b,a%b);
}
int lcm(int a,int b){
	return a*b/_gcd(a,b);
}
void print(int n) {
    if(n > 9) print(n / 10);
    putchar(n % 10 + 48);
}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		int u=read();
		for(int j=1;j<=u;j++){
			int y=read();
			e[i].push_back(y);
			de[y]++;
			out[i]++;
		}
	}
	for(int i=1;i<=n;i++){
		if(de[i]==0){
			q.push(i);
			c[i].p=1;
			c[i].q=1;
		}
	}
	int cnt=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=0;i<e[u].size();i++){
			int v=e[u][i];
			if(c[v].p==0){
				c[v].p=c[u].p;
				c[v].q=c[u].q*e[u].size();
			}else{
				node temp;
				temp.p=c[u].p;
				temp.q=c[u].q*e[u].size();
				int tt=lcm(temp.q,c[v].q);
				c[v].p=(c[v].p*(tt/c[v].q))+((tt/temp.q)*c[u].p);
				c[v].q=lcm(temp.q,c[v].q);
			}
			--de[v];
			if(!de[v]){
				q.push(v);
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(out[i]==0) print(c[i].p/_gcd(c[i].p,c[i].q)),putchar(' '),print(c[i].q/_gcd(c[i].p,c[i].q)),putchar('\n');	
	}
	return 0;
}

最后,祝大家NOIP RP++

posted @   SSZX_loser_lcy  阅读(88)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示