BZOJ2468 : [中山市选2010]三核苷酸

令d[i]为第i个样本数据,cnt为样本个数,经过化简可得

\[ans=\frac{\sum(d[i]^2)}{cnt}-(\frac{\sum d[i]}{cnt})^2\]

枚举每一种可能的三核苷酸,得到它出现的各个位置,假设当前出现了tot个,第i个的编号为a[i],经过化简可得

\[cnt+=C_{tot}^2\]

\[\sum d[i]+=\sum (a[i+1]-a[i])i(tot-i)\]

\[\sum d[i]^2+=tot\sum(a[i]^2)-(\sum a[i])^2\]

时间复杂度$O(n)$。

#include<cstdio>
#include<cstring>
#define N 100010
typedef long long ll;
int T,n,i,j,tot[64],q[64][N];ll cnt,sumd,sumd2,s,s2;char a[N];
inline ll C2(ll x){return x*(x-1)/2;}
inline ll sqr(ll x){return x*x;}
double sqr(double x){return x*x;}
double solve(){
  scanf("%s",a+1);n=strlen(a+1);
  for(i=1;i<=n;i++){
    if(a[i]==‘A‘)a[i]=0;
    else if(a[i]==‘G‘)a[i]=1;
    else if(a[i]==‘C‘)a[i]=2;
    else a[i]=3;
  }
  for(cnt=sumd=sumd2=i=0;i<64;i++)tot[i]=0;
  for(i=1;i<n-1;i++)j=a[i]|(a[i+1]<<2)|(a[i+2]<<4),q[j][++tot[j]]=i;
  for(i=0;i<64;i++)if(tot[i]>=2){
    cnt+=C2(tot[i]);
    for(j=1;j<tot[i];j++)sumd+=1LL*(q[i][j+1]-q[i][j])*j*(tot[i]-j);
    for(s=s2=0,j=1;j<=tot[i];j++)s+=q[i][j],s2+=sqr(1LL*q[i][j]);
    sumd2+=s2*tot[i]-sqr(s);
  }
  if(!cnt)return 0;
  return 1.0*sumd2/cnt-sqr(1.0*sumd/cnt);
}
int main(){
  for(scanf("%d",&T);T--;printf("%.6f\n",solve()));
  return 0;
}

  

时间: 2024-10-21 10:47:54

BZOJ2468 : [中山市选2010]三核苷酸的相关文章

bzoj 2468: [中山市选2010]三核苷酸

2468: [中山市选2010]三核苷酸 Description 三核苷酸是组成DNA序列的基本片段.具体来说,核苷酸一共有4种,分别用’A’,’G’,’C’,’T’来表示.而三核苷酸就是由3个核苷酸排列而成的DNA片段.三核苷酸一共有64种,分别是’AAA’,’AAG’,…,’GGG’.给定一个长度为L的DNA序列,一共可以分辨出(L-2)个三核苷酸.现在我们想用一些统计学的方法来进行一些分析,步骤如下: 1.       对于这(L-2)个三核苷酸,我们从左到右给予编号,分别为1到L-2.

BZOJ 2467: [中山市选2010]生成树 [组合计数]

2467: [中山市选2010]生成树 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 638  Solved: 453[Submit][Status][Discuss] Description 有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有公共的顶点.如图0所示是一个4-五角形圈. 现在给定一个n五角形

[bzoj2467][中山市选2010]生成树_快速幂

生成树 bzoj-2467 中山市选2010 题目大意:题目链接 注释:略. 想法:首先,考虑生成树的性质.每两个点之间有且只有一条路径.我们将每个五边形的5条边分为外面的4条边和内部的一条边,在此简称为外边和内边.那么显然,每个五边形的4条外边至少需要选3条. 如果选了3条外边而且内边也没选,那么这个五边形就会被拆成两个部分.如果有2个五边形这么做,就会有两个部分之间直接断开,不符合生成树的定义.而且想让一个五边形和另一个五边形断开或者这个五边形从自身断开,只有这一种方案.如果没有任何一个五边

BZOJ2467 [中山市选2010]生成树

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:BZOJ2467 正解:矩阵树定理 or  组合数学 解题报告: 这道题有两种做法- 一种是建图,然后用$Matrix-Tree$定理强上,建出基尔霍夫矩阵,高斯消元,但是建图的话有点麻烦. 还有一种就是纯粹从组合数学的角度了: 考虑如果$n$个

BZOJ 2467 中山市选2010 生成树 组合数学

题目大意:给定一个图,图的中心是一个n个点的多边形,每条边都外接一个五边形,求生成树个数 Matrix Tree定理?不会! 观察这个图 5n条边 4n个点 每个五边形都是一个环 必须拆掉一条边 拆掉之后发现4n个点 4n条边 是一个基环树 基环树的环上的边由中心多边形被拆掉的边所在的五边形的剩余边与中心多边形未被拆掉的边构成 容易发现这个环上任意拆掉一条边都会导致某个五边形被拆掉两条边 且一条边在中心多边形上 于是可知 这个图成为一棵树当且仅当一个五边形被拆掉两条边 剩余五边形被拆掉一条边 且

【bzoj 2467】[中山市选2010]生成树(数论--排列组合)

题目:有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有公共的顶点.现在给定一个n五角形圈,你的任务就是求出n五角形圈的不同生成树的数目.还记得什么是图的生成树吗?一个图的生成树是保留原图的所有顶点以及顶点的数目减去一这么多条边,从而生成的一棵树.注意:在给定的n五角形圈中所有顶点均视为不同的顶点. 解法:题目是问使这 N 五角形圈生成树的种数.而生成树

[BZOJ2467] [中山市选2010] 生成树 (排列组合)

Description 有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有公共的顶点.如图0所示是一个4-五角形圈. 现在给定一个n五角形圈,你的任务就是求出n五角形圈的不同生成树的数目.还记得什么是图的生成树吗?一个图的生成树是保留原图的所有顶点以及顶点的数目减去一这么多条边,从而生成的一棵树. 注意:在给定的n五角形圈中所有顶点均视为不同的顶点. I

【bzoj2467】[中山市选2010]生成树 矩阵树定理

题目描述 有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有公共的顶点.如图0所示是一个4-五角形圈. 现在给定一个n五角形圈,你的任务就是求出n五角形圈的不同生成树的数目.还记得什么是图的生成树吗?一个图的生成树是保留原图的所有顶点以及顶点的数目减去一这么多条边,从而生成的一棵树. 注意:在给定的n五角形圈中所有顶点均视为不同的顶点. 输入 输入包含多

【中山市选2010】【BZOJ2467】生成树

Description 有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈. 在中心的这个n边圈的每一条边同一时候也是某一个五角形的一条边,一共同拥有n个不同的五角形.这些五角形仅仅在五角形圈的中心的圈上有公共的顶点.如图0所看到的是一个4-五角形圈. 如今给定一个n五角形圈.你的任务就是求出n五角形圈的不同生成树的数目.还记得什么是图的生成树吗?一个图的生成树是保留原图的全部顶点以及顶点的数目减去一这么多条边,从而生成的一棵树. 注意:在给定的n五角形圈中全部顶点均视为