[2019南京网络赛D题]Robots
2019.9.2更新
第二天睡醒想了想发现好像搜一遍就可以过,赛时写的花里胡哨的还错了,太菜了QAQ
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + ;
struct node {
int s, e, next;
}edge[maxn];
int head[maxn], len;
void init() {
memset(head, -, sizeof(head));
len = ;
}
void add(int s, int e) {
edge[len].s = s;
edge[len].e = e;
edge[len].next = head[s];
head[s] = len++;
}
double dp[maxn], dp2[maxn];
int vis[maxn],n;
void dfs(int x) {
if (vis[x])
return;
vis[x] = ;
dp[x] = dp2[x] = ;
if (x == n)
return;
int num = ;
for (int i = head[x]; i != -; i = edge[i].next) {
int y = edge[i].e;
dfs(y);
dp[x] += dp[y];
dp2[x] += dp2[y];
num++;
}
dp[x] += num + , dp[x] /= num;
dp2[x] += (num + )*dp[x], dp2[x] /= num;
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
int m, x, y;
init();
scanf("%d%d", &n, &m);
for (int i = ; i <= m; i++)
scanf("%d%d", &x, &y), add(x, y);
memset(vis, , sizeof(vis));
dfs();
printf("%.2f\n", dp2[]);
}
}
原文
绝望ing!!!
搞了3个小时的D,到最后也没过,吃饭的时候突然想到错了,改一改就过了Orz.
遗憾!!错在求了拓扑序,要用a[n]->a[1],结果用成了n->1。要被队友骂死了QAQ
而且样例刚好1-n是拓扑序(
题意是说,在DAG中从1到n,每次有x/(x+1)的概率到相连的点,1/(x+1)的概率原地不动,(x为相连的点的个数)。每次移动需要一天,每次移动会消耗当前天数数值那么多的能量,求到达n点的期望能量消耗。
一开始就蛮有感觉的,DAG上跑期望dp,先跑期望天数,再跑期望能量,设dp[i]为i点到n点的期望天数,则初始dp[n]=0,转移为$dp[i]=\tfrac{1}{x+1}*\sum dp[j]+\tfrac{1}{x+1}*dp[i]+1$ i->j有边。
然后再跑期望能量,dp2[i]为i到n点的期望能量,初始为dp2[n]=0,转移为$dp2[i]=\tfrac{1}{x+1}*\sum dp2[j]+\tfrac{1}{x+1}*dp2[i]+dp[i]$ i->j有边。
代码极度丑陋,望见谅。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + ;
struct node {
int s, e, next;
}edge[maxn], edge2[maxn];
int head[maxn], head2[maxn], len, len2;
void init() {
memset(head, -, sizeof(head));
memset(head2, -, sizeof(head2));
len = len2 = ;
}
void add(int s, int e) {
edge[len].s = s;
edge[len].e = e;
edge[len].next = head[s];
head[s] = len++;
}
void add2(int s, int e) {
edge2[len2].s = s;
edge2[len2].e = e;
edge2[len2].next = head2[s];
head2[s] = len2++;
}
double dp[maxn], dp2[maxn];
int in[maxn], a[maxn], num[maxn];
void solve(int n) {
int lens = ;
queue<int>q;
for (int i = ; i <= n; i++)
if (in[i] == ) q.push(i);
while (!q.empty()) {
int p = q.front(); q.pop();
a[++lens] = p;
for (int i = head[p]; i != -; i = edge[i].next) {
int y = edge[i].e;
in[y]--;
if (in[y] == )
q.push(y);
}
}
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n, m, x, y;
scanf("%d%d", &n, &m);
init();
for (int i = ; i <= n; i++)
in[i] = , num[i] = , dp2[i] = dp[i] = ;
for (int i = ; i <= m; i++)
scanf("%d%d", &x, &y), add(x, y), add2(y, x), in[y]++;//正向反向各存一图,正向跑拓扑,反向求期望
solve(n);//求拓扑序
dp[a[n]] = ;
for (int x = n; x >= ; x--) {//期望dp日常倒推
if (a[x] != n) dp[a[x]] += num[a[x]] + , dp[a[x]] /= num[a[x]];//num[i]为与i点相连的点数
num[a[x]] = ;
for (int i = head2[a[x]]; i != -; i = edge2[i].next) {
int y = edge2[i].e;
dp[y] += dp[a[x]];
num[y]++;
}
}
dp2[n] = ;
for (int x = n; x >= ; x--) {
if (a[x] != n) dp2[a[x]] += (num[a[x]] + ) * dp[a[x]], dp2[a[x]] /= num[a[x]];
for (int i = head2[a[x]]; i != -; i = edge2[i].next) {
int y = edge2[i].e;
dp2[y] += dp2[a[x]];
num[y]++;
}
}
printf("%.2lf\n", dp2[]);
}
}
[2019南京网络赛D题]Robots的更多相关文章
- ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...
- 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)
2019ICPC南京网络赛A题 The beautiful values of the palace https://nanti.jisuanke.com/t/41298 Here is a squa ...
- HDU 4758 Walk Through Squares (2013南京网络赛1011题,AC自动机+DP)
Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- HDU 4751 Divide Groups (2013南京网络赛1004题,判断二分图)
Divide Groups Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU 4750 Count The Pairs (2013南京网络赛1003题,并查集)
Count The Pairs Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...
- 2019 南京网络赛A
南京网络赛自闭现场 https://nanti.jisuanke.com/t/41298 二维偏序经典题型 二维前缀和!!! #include<bits/stdc++.h> using n ...
- Robots 2019南京网络赛 (概率dp)
Robots \[ Time Limit: 1000 ms \quad Memory Limit: 262144 kB \] 题意 有一个机器人要从 \(1\) 点走到 \(n\) 点,每走一步都需要 ...
- 2019年南京网络赛E题K Sum(莫比乌斯反演+杜教筛+欧拉降幂)
目录 题目链接 思路 代码 题目链接 传送门 思路 首先我们将原式化简: \[ \begin{aligned} &\sum\limits_{l_1=1}^{n}\sum\limits_{l_2 ...
随机推荐
- java初学第一天
public class HellowWorld{ public static void main(String[] args){ System.out.println("jiuxu&quo ...
- 【SaltStack官方版】—— states教程, part 3 - 定义,包括,延伸
STATES TUTORIAL, PART 3 - TEMPLATING, INCLUDES, EXTENDS 本教程建立在第1部分和第2部分涵盖的主题上.建议您从此开始.这章教程我们将讨论更多 s ...
- 【NOIP2016提高A组模拟7.17】锦标赛
题目 403机房最近决定举行一场锦标赛.锦标赛共有N个人参加,共进行N-1轮.第一轮随机挑选两名选手进行决斗,胜者进入下一轮的比赛,第二轮到第N-1轮再每轮随机挑选1名选手与上一轮胜利的选手决斗,最后 ...
- JOI2019 有趣的家庭菜园3
问题描述 家庭菜园专家 JOI 先生在他的家庭菜园中种植了一种叫 Joy 草的植物.在他的菜园里,有 N 个花盆自东向西摆放,编号分别为 \(1, \ldots, N\).每个花盆中有一株 Joy 草 ...
- Spring快速复习和总结
IOC:管理和启动的java类的权力反转到了Spring容器了: 具体说明:Spring容器将配置好的bean放到容器(通过beanfactory,这是一个接口)中,并开始启动(反射)和调用(反射)和 ...
- table的td设置1px的方法,亲测有效
第一种方法: 1.将table的属性设置为:BORDER=0 .cellspacing=1 : 2.设置table的背景色为即你要设置的table的边框颜色: 3.设置所有td背景色为#ffffff白 ...
- 求大师点化,寻求大文件(最大20G左右)上传方案
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- HDU 6614 AND Minimum Spanning
Time limit 1000 ms Memory limit 131072 kB OS Windows 中文题意 给一张n个点的无向完全图(输入一个n就完事了),每个点标号为1~n,每条边的边权为它 ...
- 【bzoj1588】[HNOI2002]营业额统计
题目描述: 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额. ...
- Android内嵌网页webview点击其中的链接跳转到我们应用内的Activity
在一个大的Android项目中,由于客户端来不及更新和实现,经常会内嵌一些网页(在一些大型的互联网公司,PC的产品总是跑在客户端的前面),比如活动页面,通常可以内嵌用html5实现的页面,可以适配手机 ...