hdu4609 3-idiots

hdu4609 3-idiots

题意:

给出n个木棍以及它们的长度,求取其中三根长度各不相同的木棍组成三角形的概率

题解:

三角形满足条件:
任意两边之和大于第三边
我们设多项式A(x),其中Cixi(Ci是系数)C_ix^i(C_i是系数)Cixi(Ci)表示长度为i的木棍个数是CiC_iCi。那么多项式A(x)∗A(x)A(x)*A(x)A(x)A(x)xix^ixi前面的系数表示用两根木棍拼成长度为i的木棍的方案数,多项式相乘利用FFT加速O(nlogn)
对于两根木棍拼成的长度i,只要我们找到一个木棍x长度为j,j小于i,且木棍x为最长,那就是一个合法的三角形
我们维护一个后缀和sum[i]:表示对于所有j>=i,A(x)2A(x)^2A(x)2多项式中xjx^jxj前面的系数和,也就是用两个木根拼成长度大于等于i的方案数
现在我们枚举三根棍子中最长的那根木棍的长度为len,求最长木棍是len,三根木棍互不相同并能组成三角形的方案数。
对于最长为a[i],方案数为sum[a[i]+1],但是要减去很多不合法的情况,看下面的详细讨论

for(int i=1;i<=n;i++)sum[a[i]+a[i]]--;//把自己配自己的情况去掉 for(int i=1;i<=len;i++)sum[i]/=2;//把a和b组合==b和a组合,会重复,除以2 for(int i=len-1;i>=0;i--)sum[i]+=sum[i+1];//求出方案前缀和 ll ans=0;for(int i=1;i<=n;i++){ans+=sum[a[i]+1];//大于a[i]的方案数ans-=1ll*(n-i)*(i-1);//减掉一个大于a[i],一个小于a[i]的情况 ans-=1ll*(n-1);//减去一个选了自己,另一个任意选的情况ans-=1ll*(n-i)*(n-i-1)/2;//减去两个边都大于它的情况}

因为题目要求的是概率,所以再除以Cn3C_n^3Cn3

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI=acos(-1.0);
struct Complex{double x,y;Complex(double _x=0.0,double _y=0.0){x=_x;y=_y;}Complex operator -(const Complex &b)const{return Complex(x-b.x,y-b.y);}Complex operator +(const Complex &b)const{return Complex(x+b.x,y+b.y);}Complex operator *(const Complex &b)const{return Complex(x*b.x-y*b.y,x*b.y+y*b.x);}
};
void change(Complex y[],int len)
{int i,j,k;for(i=1,j=len/2;i<len-1;i++){if(i<j) swap(y[i],y[j]);k=len/2;while(j>=k){j-=k;k/=2;}if(j<k)j+=k;}
}
void fft(Complex y[],int len,int on)
{change(y,len);for(int h=2;h<=len;h<<=1){Complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));for(int j=0;j<len;j+=h){Complex w(1,0);for(int k=j;k<j+h/2;k++){Complex u=y[k];Complex t=w*y[k+h/2];y[k]=u+t;y[k+h/2]=u-t;w=w*wn;}}}if(on==-1)for(int i=0;i<len;i++)y[i].x/=len;
}
const int MAXN=400010;
Complex x1[MAXN],x2[MAXN];
int str1[MAXN/2],str2[MAXN/2],a[MAXN];
ll sum[MAXN];
int t,n;
int main()
{scanf("%d",&t);while(t--){scanf("%d",&n);memset(str1,0,sizeof str1);memset(str2,0,sizeof str2);for(int i=1;i<=n;i++){scanf("%d",&a[i]);str1[a[i]]++;str2[a[i]]++;}sort(a+1,a+n+1);int len1=a[n]+1;int len2=a[n]+1;int len=1;while(len<len1*2||len<len2*2) len<<=1;for(int i=0;i<len1;i++)x1[i]=Complex(str1[i],0);for(int i=len1;i<len;i++)x1[i]=Complex(0,0);for(int i=0;i<len2;i++)x2[i]=Complex(str2[i],0);for(int i=len2;i<len;i++)x2[i]=Complex(0,0);fft(x1,len,1);fft(x2,len,1);for(int i=0;i<len;i++)x1[i]=x1[i]*x2[i];fft(x1,len,-1);for(int i=0;i<len;i++)sum[i]=(ll)(x1[i].x+0.5);len=len1+len2-1;for(int i=1;i<=n;i++)sum[a[i]+a[i]]--;//把自己配自己的情况去掉 for(int i=1;i<=len;i++)sum[i]/=2;//把a和b组合==b和a组合,会重复,除以2 for(int i=len-1;i>=0;i--)sum[i]+=sum[i+1];//求出方案前缀和 ll ans=0;for(int i=1;i<=n;i++){ans+=sum[a[i]+1];//大于a[i]的方案数ans-=1ll*(n-i)*(i-1);//减掉一个大于a[i],一个小于a[i]的情况 ans-=1ll*(n-1);//减去一个选了自己,另一个任意选的情况ans-=1ll*(n-i)*(n-i-1)/2;//减去两个边都大于它的情况}ll w=1ll*n*(n-1)*(n-2)/6;printf("%.7f\n",(double)ans/w);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某谷 P1654 OSU!

某谷 P1654 OSU! 题目背景 原 《产品排序》 参见P2577 题目描述 osu 是一款群众喜闻乐见的休闲软件。 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作&#xff0c;每次操作只有成功与失败之分&#xff0c;成功对应1&#xff0c;失败对应0&#xff0c;n次操作…

dotnet pack 打包文件版本号引起 Could not load file or assembly 问题

如果不是遇到&#xff0c;真的不会想到&#xff0c;代码世界的问题真是千奇百怪&#xff0c;这次遇到的是 dotnet pack 打包文件版本号引起的问题。之前进行 nuget 打包都是在 Visual Studio build 时进行&#xff0c;版本号时通过 .csproj 中的 VersionPrefix 指定&#xff0c…

FFT/NTT/FMT/FWT题目

快速傅里叶变换FFT hdu4609 3-idiots P4173 残缺的字符串 Hash Function [AH2017/HNOI2017]礼物 CF993E Nikita and Order Statistics 快速沃尔什变换 FWT BZOJ4589. Hard Nim Tree Cutting HDU - 5909 快速莫比乌斯变换 FMT 快速数论变换 NTT P2000 拯救世界

[Wannafly挑战赛2D-Delete]最短路

[Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点&#xff0c;m 条边的带权有向无环图&#xff0c;同时给定起点 S 和终点 T &#xff0c;一共有 q 个询问&#xff0c;每次询问删掉某个点和所有与它相连的边之后 S 到 T 的最短路&#xff0c;询问之间互相独立(即删…

ASP.NET Core MVC 视图

ASP.NET Core MVC中视图的知识和ASP.NET MVC有很多相似之处&#xff0c;学习难度较低。以下内容主要体现了编程中模块化的思想&#xff0c;模块化才应是我们关注的重点。布局用于提供各个页面所需的公共部分&#xff0c;如&#xff1a;菜单、页头、页尾等。在ASP.NET Core中默认…

CF993E Nikita and Order Statistics

CF993E Nikita and Order Statistics 题意&#xff1a; 给你一个数组 a1∼na_{1 \sim n}a1∼n​&#xff0c;对于 k0∼nk 0 \sim nk0∼n&#xff0c;求出有多少个数组上的区间满足&#xff1a;区间内恰好有 k 个数比 x 小。 x 为一个给定的数。 n≤2105n \le 2 \times 10^5n…

ASP.NET Core 通过 Microsoft.DotNet.Watcher.Tools 实现热部署

之前开发前端的时候&#xff0c;webpack 会有热更新工具&#xff0c;在修改了代码之后&#xff0c;自动将代码编译&#xff0c;实时展现到页面上&#xff0c;给开发带来了极大的方便。Java也可以通过第三方插件JRebel实现热部署&#xff0c;不用频繁的重启Tomcat。微软官方也为…

P3825 [NOI2017]游戏

P3825 [NOI2017]游戏 题目描述 小 L 计划进行n场游戏&#xff0c;每场游戏使用一张地图&#xff0c;小 L 会选择一辆车在该地图上完成游戏。 小 L 的赛车有三辆&#xff0c;分别用大写字母A、B、C表示。地图一共有四种&#xff0c;分别用小写字母x、a、b、c表示。其中&#x…

事关SuperSocket发布,寻找YangFan哥哥

SuperSocket近日发布了2.0的第一个预览版《SuperSocket 2.0 Preview1 发布&#xff0c;.NET Socket服务器框架》&#xff0c;在NuGet上以一个包含数个SuperSocket程序集的大包的形式发布。https://www.nuget.org/packages/SuperSocket/2.0.0-preview1我原意以独立小包的形式发布…

P3321 [SDOI2015]序列统计(未解决)

P3321 [SDOI2015]序列统计 题意&#xff1a; 题解&#xff1a; 参考题解&#xff1a; 题解 P3321 【[SDOI2015]序列统计】 【LG3321】[SDOI2015]序列统计 神仙题。。学透再补 代码&#xff1a;

P1963 [NOI2009]变换序列

题目描述 不想水字&#xff0c;详见某谷&#xff1a;P1963 [NOI2009]变换序列 solution 其实 的计算就类似于环上的距离。 对于每一个 都可能有两种位置选择&#xff1a;&#xff0c; 。 所以把它们分别连边&#xff0c;二分图上匈牙利算法求完美匹配即可。 #include&…

一次 .NET Core 中玩锁的经历:ManualResetEventSlim, SemaphoreSlim

最近同事对 .net core memcached 缓存客户端 EnyimMemcachedCore 进行了高并发下的压力测试&#xff0c;发现在 linux 上高并发下使用 async 异步方法读取缓存数据会出现大量失败的情况&#xff0c;比如在一次测试中&#xff0c;100万次读取缓存&#xff0c;只有12次成功&…

BZOJ4589. Hard Nim

BZOJ4589. Hard Nim 题意&#xff1a; Claris和NanoApe在玩石子游戏&#xff0c;他们有n堆石子&#xff0c;规则如下&#xff1a; Claris和NanoApe两个人轮流拿石子&#xff0c;Claris先拿。每次只能从一堆中取若干个&#xff0c;可将一堆全取走&#xff0c;但不可不取&…

P2825 [HEOI2016/TJOI2016]游戏

题目描述 详见 P2825 [HEOI2016/TJOI2016]游戏。 solution 套路题。 一般思路是行列建点跑二分图最大匹配。 此题中的#会分隔行列&#xff0c;因此我们把每行的极大联通块设为点&#xff0c;列同理建点。 再对于每个*对应的行的极大联通块与列的最大联通块编号连边&…

P3033 [USACO11NOV]牛的障碍Cow Steeplechase

P3033 [USACO11NOV]牛的障碍Cow Steeplechase 题目描述 详见&#xff1a;P3033 [USACO11NOV]牛的障碍Cow Steeplechase solution 裸题。 对于每一对相交的线段&#xff0c;连一条边&#xff0c;表示这一对线段不能都取。 显然这样会建立一个二分图&#xff08;横的线段不…

Tree Cutting HDU - 5909

Tree Cutting HDU - 5909 题意&#xff1a; 一个无根树&#xff0c;n个点&#xff0c;n-1条边&#xff0c;每个节点有一个权值&#xff0c;一棵树的权值就是其节点(包含本身及其子节点)的权值的异或和&#xff1b;求价值为[0,m)的树有多少颗&#xff1f;(所谓的树其实就是原连…

Redis作者antirez:开源维护者的挣扎

这两天&#xff0c;一篇名为《开源维护者的挣扎》的文章被迅速顶至 Hacker News 首页&#xff0c;这是 Redis 作者 antirez 发布的最新博客。几个月前&#xff0c;一名开源项目的维护者向 antirez 发邮件&#xff0c;倾诉自己苦心维护项目多年&#xff0c;这或多或少带来了一些…

CF662C Binary Table

CF662C Binary Table 题意&#xff1a; 有一个 n 行 m 列的表格&#xff0c;每个元素都是 0/1 &#xff0c;每次操作可以选择一行或一列&#xff0c;把 0/1 翻转&#xff0c;即把 0 换为 1 &#xff0c;把 1 换为 0 。请问经过若干次操作后&#xff0c;表格中最少有多少个 1 …

P4111 [HEOI2015]小Z的房间

P4111 [HEOI2015]小Z的房间 题目描述 详见&#xff1a;P4111 [HEOI2015]小Z的房间 solution Matrix-Tree裸题。 题意为求一个有障碍的网格图的生成树个数。 因此对于每一个点向左边和上面的节点连边&#xff0c;Matrix-Tree定理求解生成树个数即可。 #include<bits/s…

黑科技抢先尝(续) - Windows terminal中WSL Linux 终端的极简美化指南

之前&#xff0c;本人写了两篇文章 黑科技抢先尝 | Windows全新终端初体验(附代码Build全过程) 和 程会玩 | 无需自行编译也能玩转 Windows Terminal&#xff0c;介绍了玩转Windows terminal的两种方式。今天这篇文章&#xff0c;主要介绍如何美化 Windows terminal 中 WSL 的 …