水坝排水系统c语言,题解 NOIP2020 T1 排水系统
带 gcd 的纯模拟。( gcd 就是求最大公约数)
gcd 用来处理分数相加时的分母通分和分数的约分,
通过 gcd 珂以求出 lcm (最小公倍数):
\\(\\operatorname{lcm}(x,y)=\\frac{x \\times y}{\\gcd(x,y)}\\)
开个结构体存分数,然后就珂以愉快地拓扑排序了。
最后几个点 WA 是因为 long long 不够用,
开个 __int128 就能过了。
考场上就乖乖写高精吧(逃
代码:
#include
#include
#include
#include
#include
#include
#include
#define Rei register int
#define ll __int128//注意是两个下划线!
using namespace std;
template
inline void read(T &x) {
x=0;
char f=0,c;
while(c=getchar(),!isdigit(c)) if(c==\'-\') f=1;
if(f) while(isdigit(c)) x=x*10-c+48,c=getchar();
else while(isdigit(c)) x=x*10+c-48,c=getchar();
}
void write(__int128 x) {//__int128需要手写输入输出
if(x/10) write(x/10);
putchar(x%10+\'0\');
}
inline ll gcd(ll x,ll y) {//辗转相除法求gcd
ll t;
while(y) t=x%y,x=y,y=t;
return x;
}
const int N=1e5+2;
int n,m,cnt,rbq,son;
int h[N],rd[N],d[N];
struct node {
int next,to;
node(int next=0,int to=0) {
this->next=next,this->to=to;
}
} b[N*5];
struct fenshu {
ll fenzi,fenmu;
fenshu(ll fenzi=0,ll fenmu=1) {//注意分母不能为0
this->fenzi=fenzi,this->fenmu=fenmu;
}
void huajian() {//分数的化简
ll g=gcd(fenzi,fenmu);
fenzi/=g,fenmu/=g;
}
} O2[N];
fenshu jia(fenshu x,fenshu y) {//这里自己推一下就懂了
ll g=gcd(x.fenmu,y.fenmu);
ll k1=y.fenmu/g,k2=x.fenmu/g;
return fenshu(x.fenzi*k1+y.fenzi*k2,x.fenmu*k1);
}
inline void link(int u,int v) {
b[++cnt]=node(h[u],v),h[u]=cnt,++rd[v];
}
queue q;
vector ans;
void tuopu() {//拓扑排序
for(Rei i=1; i<=n; ++i) {
if(!rd[i]) {
q.push(i);
O2[i]=fenshu(1,1);
}
}
while(!q.empty()) {
rbq=q.front(),q.pop();
if(!d[rbq]) {
ans.push_back(rbq);
continue;
}
O2[rbq].fenmu*=d[rbq];//水分流
O2[rbq].huajian();
for(Rei i=h[rbq]; i; i=b[i].next) {
--rd[son=b[i].to];
O2[son]=jia(O2[son],O2[rbq]);
O2[son].huajian();
if(!rd[son]) {
q.push(son);
}
}
}
}
int main() {
read(n),read(m);
for(Rei i=1; i<=n; ++i) {
read(d[i]);
for(Rei j=1; j<=d[i]; ++j) {
read(rbq),link(i,rbq);
}
}
tuopu();
sort(ans.begin(),ans.end());
for(int i=0; i
write(O2[ans[i]].fenzi),putchar(\' \');
write(O2[ans[i]].fenmu),putchar(\'\\n\');
}
return 0;
}
第一次写题解,请多包涵。
水坝排水系统c语言,题解 NOIP2020 T1 排水系统相关推荐
- NOIP2020 T1排水系统
传送门luoguP7113 我们先手动模拟一下: 虽然图画的丑,也画的水. 但我们不难发现: 流向子节点的水等于父节点的水除以出度. 由于要得到某个点的流量,我们要先计算出父节点的流量,这样我们不难发 ...
- NOIP 2020 T1 排水系统(拓扑排序)
NOIP 2020 T1 排水系统 题解 很显然是拓扑排序,按题意直接模拟复杂度仅仅是 O ( n ) O(n) O(n)的. 但是涉及到分数的加法,通分会爆变量范围吗? 一开始以为最大只是 5 11 ...
- 华为机考HJ4字符串分隔C语言题解
华为机考HJ4字符串分隔C语言题解 好家伙,今天的while循环检测文件末尾又好使了. 把白给打在公屏上. 主要思路就是求余的花样使用. 首先把字符串数组里的内容全部放入新的数组. 新的数组每满八个就 ...
- 力扣 两数相加 C语言 题解
** 力扣 两数相加 C语言 题解 ** 文章目录 力扣 两数相加 C语言 题解 一.完整题目 二.解题思路 二.编写代码 四.测评结果 五.总结评价 一.完整题目 给你两个非空的链表,表示两个非负的 ...
- 「NOIP2020」排水系统(water)
题解1 我成功地把一道 1000 bytes 1000\operatorname{bytes} 1000bytes 的签到题活生生地整成了 5000 bytes 5000\operatorna ...
- 【蓝桥真题5】带三百人训练了十天精选蓝桥真题,看看他们都练些什么(三门语言题解)
⭐️引言⭐️ 大家好啊,我是执梗.最近一周多都没有更新文章了,因为确实是非常忙,在上篇文章了一下开启了蓝桥打卡31日的活动.每天忙着群里管理解答,统计打卡,寻找真题,根本没有时间更新文章.每天也过的非 ...
- 牛客网C语言题解1-指针
说明:笔者水平有限,这当做个人学习C语言的笔记,如有错误欢迎指出和讨论. 题目 求程序运行结果 #include<stdio.h> void foobar(int a, int *b, i ...
- 【猜名次】-C语言-题解
1. 描述: 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果: A选手说:B第二,我第三: B选手说:我第二,E第四: C选手说:我第一,D第二: D选手说:C最后,我第三: E选手说:我第 ...
- c程序设计语言 题解,C程序设计语言综合设计》 解题报告
<C程序设计语言综合设计> 解题报告>由会员分享,可在线阅读,更多相关<C程序设计语言综合设计> 解题报告(16页珍藏版)>请在人人文库网上搜索. 1.程序设计语言 ...
最新文章
- 第一阶段团队成员贡献打分
- Adnroid提高效率之资源移动
- ntnub原理怎么看_老电工由浅入深带你入门学PLC的工作原理和梯形图的编程规则...
- 给公司部门设计的SOA架构
- php 天比较,php 计算距离天的时间还有多少天
- shell输入输出重定向
- linux上如何查看具体的命令属于哪个安装包
- (译)使用cocos2d和box2d制作滚动背景
- web.xml中配置启动时加载的servlet,load-on-starup
- pytorch实现孪生神经网络对人脸相似度进行识别
- 校园实践-2015级软工07111501班级-校园二手交易项目组
- 共享打印机服务器脱机状态,共享打印机脱机无法打印
- Ajax选项卡、隔行换色、弹出遮罩层…
- HTML+CSS静态页面游戏网站设计——腾讯游戏(页)学生HTML个人网页作业作品下载 个人网页设计制作 大学生个人网站作业模板 简单个人网页制作
- Day16:数据仓库设计
- java迷你DVD管理器
- 牢骚:各种奇奇怪怪的问题。。。
- A 0.18um CMOS SOC for a 100-m-Range 10-Frame/s 200x96 pixel time-of-flight Depth Sensor翻译
- openEuler 社区 2022 年 12 月运作报告
- 数学知识——约数(因数)