(施工中……已更新DF)

比赛传送门:https://www.jisuanke.com/contest/3004

D. Robots(期望dp)

题意

给一个DAG,保证入度为$0$的点只有$1$,出度为$0$的点只有$n$。

现在一个机器人从$1$出发,每天都会以相同的概率前往相邻节点之一或静止不动。

每天机器人消耗的耐久等于经过的天数。

求机器人到点$n$期望消耗的耐久。

划水划的很愉快,唯一一道做出来的题。但是和题解做法不同(感觉我的方法麻烦),因此砸了3h在这题上面(正在试图读懂题解ing)。

设$f[u][j]$表示第$j$天从点$u$出发到$n$期望消耗的耐久,$out[i]$表示$i$的出度$+1$,那么答案就是$f[1][1]$。

初始的方程就不写了很容易。

经过一大顿推导可以求出$f[u][j]=\frac{out[u]}{out[u]-1}\times j+\frac{out[u]}{(out[u]-1)^2}+\sum_v(\frac{f[v][j+1]}{out[u]}+\frac{f[v][j+2]}{out[u]^2}+...)$,其中$v$为$u$相邻节点。

后面那点奇葩的东西很难处理,不妨我们先思考对于$1->2$这样的一个图,$f[1][j]$是多少?

咦为什么这个东西是个等差数列?

于是我们假设$f[v][j]$也是一个等差数列,则原式子可以化为$f[u][j]=\frac{out[u]}{out[u]-1}\times j+\frac{out[u]}{(out[u]-1)^2}+\sum_v \frac{f[v][j+1]*out[u]-f[v][j]}{(out[u]-1)^2}$,总之你能求出$f[u][j]$也是个等差数列就是了。

于是数学归纳法可以求出所有的$f[u][j]$都是等差数列,因此我们$j$只需要求$1$和$2$,然后从后往前求即可,复杂度$O(n+m)$,细节和具体实现看代码。

#include<cmath>
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double dl;
const int N=1e5+;
const int M=2e5+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
int to,nxt;
}e[M];
int n,m,cnt,head[N],out[N],dep[N];
dl f[N][];
inline void add(int u,int v){
e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;out[u]++;
}
void init(){
for(int i=;i<=n;i++){
head[i]=;out[i]=;
f[i][]=f[i][]=;
}
cnt=;
}
dl F(int u,int j){
if(u==n)return ;
if(f[u][]>&&f[u][]>)return (f[u][]-f[u][])*(j-)+f[u][];
dl sum=(dl)out[u]/(out[u]-)*j+(dl)out[u]/(out[u]-)/(out[u]-);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
dl div=(out[u]-)*(out[u]-);
dl a1=-F(v,j);dl a2=F(v,j+)*out[u];
sum+=(a1+a2)/div;
}
return f[u][j]=sum;
}
int main(){
int T=read();
for(int cas=;cas<=T;cas++){
n=read(),m=read();
init();
for(int i=;i<=m;i++){
int u=read(),v=read();add(u,v);
}
printf("%.2Lf\n",F(,));
}
return ;
}

F. Greedy Sequence(线段树)

题意

给定一个长度为$n$的排列$a$,对每一个 $i \in [1,n]$,定义一个序列$s_i$,规则如下:

①$s_i[1]=i$;

②对于每一个$j\in [2,n],s_i[j]\le s_i[j−1]$;

③对于每一个$j\in [2,n],s_i[j],s_i[j-1]$ 在 $a$ 中的位置之差的绝对值$\le k$,并且$a$中的每一个元素至多在$s_i$中出现一次;

④填不了时,用 $0$ 填充剩余的数至$s_i$长度为$n$为止;

⑤$s_i[j]$要尽可能的大;

输出$|s_1|,|s_2|,...,|s_n|$,其中$|s_i|$为序列$s_i$中不为$0$的数的个数。

显然我们要取的数是可取区间内最大的,并且容易发现,前一个数取$i$则后一个数一定会取某个数不变。

于是维护$nxt[i]$表示$i$后面取的数,$nxt$数组可用线段树求出。

#include<cmath>
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int n,k,w[N],id[N],nxt[N],sum[N];
int tr[N<<];
void build(int a,int l,int r){
if(l==r){
tr[a]=w[l];return;
}
int mid=(l+r)>>;
build(a<<,l,mid);build(a<<|,mid+,r);
tr[a]=max(tr[a<<],tr[a<<|]);
}
void modify(int a,int l,int r,int x,int y){
if(l==r){
tr[a]=y;return;
}
int mid=(l+r)>>;
if(x<=mid)modify(a<<,l,mid,x,y);
else modify(a<<|,mid+,r,x,y);
tr[a]=max(tr[a<<],tr[a<<|]);
}
int query(int a,int l,int r,int l1,int r1){
if(r<l1||r1<l)return ;
if(l1<=l&&r<=r1)return tr[a];
int mid=(l+r)>>;
return max(query(a<<,l,mid,l1,r1),query(a<<|,mid+,r,l1,r1));
}
inline void check(int x){
int where=id[x];
modify(,,n,where,);
nxt[x]=query(,,n,max(,where-k),min(n,where+k));
}
int main(){
int T=read();
for(int cas=;cas<=T;cas++){
n=read(),k=read();
for(int i=;i<=n;i++){
w[i]=read();id[w[i]]=i;
sum[i]=;
}
build(,,n);
for(int i=n;i>=;i--)check(i);
for(int i=;i<=n;i++)sum[i]+=sum[nxt[i]]+;
for(int i=;i<=n;i++){
if(i!=)putchar(' ');
printf("%d",sum[i]);
}
putchar('\n');
}
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

The Preliminary Contest for ICPC Asia Nanjing 2019/2019南京网络赛——题解的更多相关文章

  1. [The Preliminary Contest for ICPC Asia Nanjing 2019] A-The beautiful values of the palace(二维偏序+思维)

    >传送门< 前言 这题比赛的时候觉得能做,硬是怼了一个半小时,最后还是放弃了.开始想到用二维前缀和,结果$n\leq 10^{6}$时间和空间上都爆了,没有办法.赛后看题解用树状数组,一看 ...

  2. 计蒜客 The Preliminary Contest for ICPC Asia Nanjing 2019

    F    Greedy Sequence You're given a permutation aa of length nn (1 \le n \le 10^51≤n≤105). For each  ...

  3. The Preliminary Contest for ICPC Asia Nanjing 2019

    传送门 A. The beautiful values of the palace 题意: 给出一个\(n*n\)的矩阵,并满足\(n\)为奇数,矩阵中的数从右上角开始往下,类似于蛇形填数那样来填充. ...

  4. The Preliminary Contest for ICPC Asia Nanjing 2019 H. Holy Grail

    题目链接:https://nanti.jisuanke.com/t/41305 题目说的很明白...只需要反向跑spfa然后输入-dis,然后添-dis的一条边就好了... #include < ...

  5. The Preliminary Contest for ICPC Asia Nanjing 2019 B. super_log (广义欧拉降幂)

    In Complexity theory, some functions are nearly O(1)O(1), but it is greater then O(1)O(1). For examp ...

  6. 树状数组+二维前缀和(A.The beautiful values of the palace)--The Preliminary Contest for ICPC Asia Nanjing 2019

    题意: 给你螺旋型的矩阵,告诉你那几个点有值,问你某一个矩阵区间的和是多少. 思路: 以后记住:二维前缀和sort+树状数组就行了!!!. #define IOS ios_base::sync_wit ...

  7. B.super_log(The Preliminary Contest for ICPC Asia Nanjing 2019)

    同:https://www.cnblogs.com/--HPY-7m/p/11444923.html #define IOS ios_base::sync_with_stdio(0); cin.tie ...

  8. H.Holy Grail ( floyd )(The Preliminary Contest for ICPC Asia Nanjing 2019)

    题意: 给出一个有向图,再给出6条原来不存在的路径,让你在这6条路径上添加一个最小的数,使图不存在负环. 思路: 直接6遍 floyd 输出就行了. #include <bits/stdc++. ...

  9. F. Greedy Sequence(主席树区间k的后继)(The Preliminary Contest for ICPC Asia Nanjing 2019)

    题意: 查找区间k的后继. 思路: 直接主席树. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio&g ...

随机推荐

  1. Linux 下的 mysql 自动备份

    Linux 下实现自动备份,主要就是编写好执行备份的 shell script( *.sh )文件,设好权限(可读,可执行).然后利用 Linux 定时任务 crontab 来执行备份脚本就可以了.以 ...

  2. Bootstrap初始化过程源码分析--netty客户端的启动

    Bootstrap初始化过程 netty的客户端引导类是Bootstrap,我们看一下spark的rpc中客户端部分对Bootstrap的初始化过程 TransportClientFactory.cr ...

  3. Linux文本编辑器的常用命令

    Vi文本编辑器 首先介绍命令模式,命令模式是在进入文本编辑器的时候的当前状态:输入模式(插入模式)是在插入文本时候按下的键,比如 大小 i  键,a键.o键:底行模式是在命令模式的状态直接输入冒号 & ...

  4. shell公共函数functions

    checkpid:检查是否已存在pid,如果有一个存在,返回0(通过查看/proc目录) daemon:启动服务 killproc:杀死某个进程 pidfileofproc:寻找某个进程的pid pi ...

  5. c语言-数组、指针面试题

    转载 说明:所有题目均摘录于网络以及我所见过的面试题目,欢迎补充! 无特殊说明情况下,下面所有题s目都是linux下的32位C程序. 先来几个简单的热热身. 1.计算以下sizeof的值. char ...

  6. SwitchGame---MybatisPLus

    //实体类package com.example.spring.entity; import cn.afterturn.easypoi.excel.annotation.Excel;import cn ...

  7. c# MVC5(二) MVC与IOC结合

    今天主要来讲解使用Unity来自动注入.Unity前面我们已经详细的介绍过了,如有需要请自行前往去看,今天我们的重点是说MVC与IOC的结合. IOC:控制反转,控制反转的工具是DI(依赖注入:构造函 ...

  8. MySql || 快速创建100w条记录

    平时每个开发者都会讨论数据量大时,sql的优化问题.但是并不是每个人都会有100w的数据量可以用来实战,那么今天我们就自己动手,模拟一个100w数据量的表. 创建原理 其实创建的方法有很多,有快的也有 ...

  9. Pytorch: parameters(),children(),modules(),named_*区别

    nn.Module vs nn.functional 前者会保存权重等信息,后者只是做运算 parameters() 返回可训练参数 nn.ModuleList vs. nn.ParameterLis ...

  10. ActiveMQ 入门和与 Spring 整合

    ActiveMQ 入门演示 activemq 依赖 <dependency> <groupId>org.apache.activemq</groupId> < ...