bzoj 2784 [JLOI2012]时间流逝——树上高斯消元

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2784

一个状态可以加很多个能量圈,但减少能量圈的情况只有一种。所以可以用树来刻画。

然后就变成树上高斯消元的套路了。注意根节点的 P 等于 0 。

发现不是要求 dp[ 1 ] 就必须在那个式子里设出 a*dp[ 1 ] 之类的。

据说树上的点大概有 1.2*106 个。大概就是贝尔数吧。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define mkp make_pair
#define fir first
#define sec second
#define db double
using namespace std;
const int N=35;
int n,m,w[N];db P;
pair<db,db> dfs(int lm,int s)
{
  db ta=0,tb=0;if(s>n)return mkp(0,0);
  for(int i=1;i<=lm;i++)
    {
      pair<db,db> v=dfs(i,s+w[i]);
      ta+=v.fir; tb+=v.sec;
    }
  if(!s)P=0;
  ta=1-(1-P)/lm*ta; ta=1/ta;
  tb=((1-P)/lm*tb+1)*ta; ta=P*ta;
  return mkp(ta,tb);
}
int main()
{
  while(scanf("%lf",&P)==1)
    {
      scanf("%d%d",&n,&m);
      for(int i=1;i<=m;i++)scanf("%d",&w[i]);
      sort(w+1,w+m+1);//
      printf("%.3f\n",dfs(m,0).sec);
    }
  return 0;
}

原文地址:https://www.cnblogs.com/Narh/p/10280113.html

时间: 2024-08-27 02:28:37

bzoj 2784 [JLOI2012]时间流逝——树上高斯消元的相关文章

bzoj 2784 时间流逝 —— 树上高斯消元

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2784 其实转移是一棵树,从根到一个点表示一种能量圈状态,当能量值大于 T 是停止,也就是成为叶子: 点数大约是整数划分,据说是 1.2e6 左右,可以 dfs: 设 \( d[x] \) 是儿子数,则 \( f[x] = p*(f[fa]+1) + (1-p) \frac{\sum\limits_{v \in son}(f[v]+1)}{d[x]} \) 仍然设 \( f[x] = K[x

BZOJ 3143 HNOI2013 游走 高斯消元 期望

这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和. 现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小. 输出最小的总分期望值. Solution: 这题贪心很明显

bzoj 2115: [Wc2011] Xor xor高斯消元

2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 797  Solved: 375[Submit][Status] Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图中可能有重边或自环. Output 仅包含一个整数,表示最大的XOR和(十进制结

BZOJ 2115 Wc2011 Xor DFS+高斯消元

题目大意:给定一个无向图,每条边上有边权,求一条1到n的路径,使路径上权值异或和最大 首先一条路径的异或和可以化为一条1到n的简单路径和一些简单环的异或和 我们首先DFS求出任意一条1到n的简单路径以及图中所有最简单的简单环(环上不存在两个点可以通过环外边直连) 然后在一些数中选出一个子集,使它们与一个给定的数的异或和最大,这就是高斯消元的问题了 利用高斯消元使每一位只存在于最多一个数上 然后贪心求解即可 #include<cstdio> #include<cstring> #in

BZOJ 3270 博物馆 期望DP+高斯消元

题目大意:给定一张无向连通图,两个人初始各在某个点上,每个时刻每个人会不动或任选出边走,求两人最终期望在哪里相遇 把点数平方,原图上的两个点(x,y)变成新图上的一个点 然后令A为这个图的邻接矩阵(若两人在同一点上则没有出边,否则按概率转移),S为初始行向量(S[(a,b)]=1),ans为答案行向量 那么有ans=S+SA+SA^2+SA^3+... =S(I-A^+∞)/(I-A) =S/(I-A) 于是有ans*(I-A)=S 于是对I-A的转置求高斯消元即可. 和驱逐猪猡那题的思路很像.

CF802L Send the Fool Further! (hard) 树上高斯消元

朴素的高斯消元是 $O(n^3)$ 的,但是由于叶节点是终止节点,所以可以逐层向上推成 $k\times f(fa)+b$ 的形式. 推到根节点时直接取根节点的 $b$ 值就可以了. code: #include <cstdio> #include <cstring> #include <algorithm> #define ll long long #define mod 1000000007 #define N 100067 #define setIO(s) fre

BZOJ 2322 BeiJing2011 梦想封印 高斯消元

题目大意:给定一张带权无向图,每次删去一条边并询问从点1出发走一条路径可以走出多少种不同的边权异或和 删边不好做 首先倒着做 把删边改成加边 回忆2115那题的做法 我们可以把一条路径的异或和拆成一条简单路径和一些环的异或值 2115是求最大异或和  这个题是求异或和的个数 因此我们维护两个集合 环的异或和集合和路径的异或和集合 这里说的路径包括原地不动 即从1到1的路径 如果一个环的异或和能被其它环线性表示 那么这个环对答案显然没有贡献 于是这个环就可以从集合中删掉 因此环的集合要维护一个线性

BZOJ 3143: [Hnoi2013]游走( 高斯消元 )

我一开始的想法是设f(x)表示点x到N路径的期望长度, 那么f(u) = (∑f(v)+w(u,v)) / degreeu, f(N)=0, 我们代入入消元应该可以得到f(1)关于各条边长的关系式f(1)=∑we..然后贪心, 按照他们的系数来给边权...但是不会实现..但是我感觉是可行的..PoPoQQQ题解:http://blog.csdn.net/PoPoQQQ/article/details/42234607 ---------------------------------------

BZOJ 4004: [JLOI2015]装备购买 [高斯消元同余 线性基]

和前两(一)题一样,不过不是异或方程组了..... 然后bzoj的新数据是用来卡精度的吧..... 所有只好在模意义下做啦 只是巨慢无比 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <bitset> using namespace std; typedef long lon