news 2026/8/31 10:59:51

洛谷P7113 [NOIP2020] 排水系统题解/NOIP2020正式赛 排水系统(water)题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷P7113 [NOIP2020] 排水系统题解/NOIP2020正式赛 排水系统(water)题解

原题链接

题意分析:

城市的排水系统是一个n个节点的DAG(有向无环)图,有m个污水接收口且每个污水接收口有1吨的水,放水过程中会平均分给子节点,没有子节点的水管就是最终排水口,最后按编号顺序输出每个最终排水点的污水(以分数形式)。

思路:

考虑到图是稀疏图(0 ≤ d i ≤ 5 0 \le d_i \le 50di5),以邻接表存图,然后以拓扑排序模拟污水流动,模拟过程中我们以一个n大小的数组,存当前每一个顶点所对应的污水量(以分数形式存储),污水流动的计算其实就是两个分数相加,先算分母a与c的最小公倍数gbs=a*c/gcd(a,c),再根据以下公式将分数相加:

b a + d c = b ∗ g b s / a + d ∗ g b s / c g b s \frac{b}{a} + \frac{d}{c}=\frac{b*gbs/a+d*gbs/c}{gbs}ab+cd=gbsbgbs/a+dgbs/c

然而这道题的分母,根据题意(水在从一个接收口流向一个最终排水口的过程中,不会经过超过 10 个中间排水结点),故而分母在计算过程中最坏情况下会达到3 10 ∗ 4 10 ∗ 5 10 3^{10}*4^{10}*5^{10}310410510,且最多放10吨水,故而分子最大可达到分母的10倍:10 ∗ 3 10 ∗ 4 10 ∗ 5 10 10*3^{10}*4^{10}*5^{10}10310410510,这会爆掉int(只能拿30分),long long也会爆(只能拿60分),所以需要更高精度的手段处理分母.

这里有两种解决方案.第一种是采用高精度算法,然而观察上述分数相加的公式,我们需要实现大数加乘除求余才能解决这个问题,太过麻烦.

考虑10 ∗ 3 10 ∗ 4 10 ∗ 5 10 10*3^{10}*4^{10}*5^{10}1031041051010 < 2 4 , 3 10 < 2 20 , 4 10 = 2 20 , 5 10 < 2 30 10< 2^{4},3^{10}< 2^{20},4^{10}= 2^{20},5^{10}<2^{30}10<24,310<220,410=220,510<230,故分子必然小于2 74 2^{74}274,我们使用c++11标准中提供的_int128必然可解决这个问题,即可拿到100分.

此处请注意:__int128不能用cout或printf输出故需要自己实现输出

AC代码(因使用了__int128请以c++11及以上标准提交)

#include<bits/stdc++.h>using namespace std;typedef__int128 lll;constintMAXN=1e5+5;vector<int>edge[MAXN];// 邻接表intrd[MAXN];// 入度数组lll wus[MAXN][2];// 当前污水量lllgcd(lll a,lll b){if(b==0)returna;returngcd(b,a%b);}// 打印__int128类型变量voidwrite(lll num){if(num<0){putchar('-');num=-num;}if(num>9)write(num/10);putchar(num%10+'0');}intmain(){intn,m;cin>>n>>m;// 邻接表存图并处理入度数组intd,c;memset(rd,0,sizeof(rd));for(inti=1;i<=n;i++){edge[i].clear();cin>>d;for(intj=1;j<=d;j++){cin>>c;rd[c]++;edge[i].push_back(c);}}// 拓扑排序for(inti=1;i<=n;i++)wus[i][0]=0,wus[i][1]=1;//最开始每个位置的污水都是0/1,即为0.queue<int>que;for(inti=1;i<=m;i++){que.push(i);wus[i][0]=1;}while(!que.empty()){inttop=que.front();que.pop();inttemp=edge[top].size();if(temp){wus[top][1]*=temp;//top的污水量先除temp方便下面运算// top向所有子节点排污水for(inti=0;i<temp;i++){// top->edge[top][i] 排污水// top的污水排向edge[top][i]的计算实则两个分数的求和,参考思路中的公式lll gbs=wus[top][1]*wus[edge[top][i]][1]/gcd(wus[top][1],wus[edge[top][i]][1]);wus[edge[top][i]][0]=wus[top][0]*(gbs/wus[top][1])+wus[edge[top][i]][0]*(gbs/wus[edge[top][i]][1]);wus[edge[top][i]][1]=gbs;if(--rd[edge[top][i]]==0)que.push(edge[top][i]);}// 排完污水后,top位置污水清0wus[top][0]=0;wus[top][1]=1;}}// 按编号顺序输出每个点的污水量for(inti=1;i<=n;i++){if(wus[i][0]){lll kk=gcd(wus[i][0],wus[i][1]);write(wus[i][0]/kk);cout<<" ";write(wus[i][1]/kk);cout<<endl;}}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 10:56:10

DeepSeek Harness识屏插件实战:让AI编程助手看懂屏幕报错

这次我们来看一个很实际的东西——我最近给 deepseek harness 写了一个识屏插件&#xff0c;让它能“看到”屏幕上的内容&#xff0c;再把识别结果交给 DeepSeek 模型做判断。先说结论&#xff1a;这类 harness 工具本身解决的是“给 AI 编程助手换一个后端模型”的问题&#x…

作者头像 李华
网站建设 2026/8/31 10:53:43

传统企业AI落地实战:RAG知识库问答系统从0到1

最近不少技术群里聊得最多的话题&#xff0c;已经从“AI 能做什么”变成了“AI 到底怎么在我们公司跑起来”。连不少传统行业的研发负责人也开始焦虑&#xff1a;友商接入了大模型&#xff0c;老板开会问 AI 战略&#xff0c;客户开始要求 API 对接&#xff0c;而自己团队的代码…

作者头像 李华
网站建设 2026/8/31 10:53:28

Hmmsim Legacy 闪退报错?手把手教你删除不兼容 Add-ons 线路

打开 Hmmsim Legacy 时突然闪退&#xff0c;或者加载某条线路时直接卡死、报错退出&#xff0c;相信不少玩 Hmmsim 系列的玩家都碰到过。这类问题往往不是游戏本体坏了&#xff0c;而是 Add-ons 目录下的线路文件与当前游戏版本不兼容。本文从 Hmmsim Legacy 的 Add-ons 文件机…

作者头像 李华
网站建设 2026/8/31 10:52:48

嵌入式软件开发笔试高频考点与备考策略:C语言、通信协议、Linux全覆盖

最近不少准备秋招的朋友在传一份“顺丰科技2019秋招嵌入式软件开发工程师客观题合集”&#xff0c;我仔细刷了一遍&#xff0c;有些题确实有年头了&#xff0c;但嵌入式软件开发这个岗位的考察逻辑没怎么变。尤其是顺丰这种物流科技公司&#xff0c;它的嵌入式岗位和纯消费电子…

作者头像 李华
网站建设 2026/8/31 10:52:09

Grok 4.6全模式开发接入指南:从API配置到多模态与工具调用实战

最近很多读者在问&#xff1a;Grok 4.6 全模式上线后&#xff0c;开发侧到底该怎么接入&#xff1f;网上信息比较分散&#xff0c;有的讲概念&#xff0c;有的贴截图&#xff0c;真正能让人直接跑通的教程不多。这篇文章我会从开发者视角出发&#xff0c;围绕“全模式”这个重点…

作者头像 李华
网站建设 2026/8/31 10:50:02

如何快速上手 Apache Airflow 3:工作流编排、调度与监控指南

如何快速上手 Apache Airflow 3&#xff1a;工作流编排、调度与监控指南 【免费下载链接】airflow Apache Airflow - A platform to programmatically author, schedule, and monitor workflows 项目地址: https://gitcode.com/GitHub_Trending/ai/airflow Apache Airfl…

作者头像 李华