原文链接https://www.cnblogs.com/zhouzhendong/p/9781060.html

题目传送门 - NowCoder Wannafly 26D

题意

  放一放这一题原先的题面:

阿尔法城

空间限制 512MB
时间限制 2s

题目描述

听说遥远的α城里神仙题横行,毒瘤题占道,zzd 决定来送一道温暖。

zzd 现在正距离α城很远处(可以理解成无穷远),通过望远镜看到了 α 城里的景象。

α城中有 n 座高楼,排成一条直线,其中第 i 座高楼的高度为 a[i] ,颜色为 c[i] 。任意两个高楼不同,即使他们的高度和颜色都相同。

zzd 惊喜地发现这些高楼排成的直线恰好与 zzd 的视线重合,且离 zzd 最近的是第 1 座高楼。

如果一座大楼之前没有高度不小于它的高楼遮挡,那么 zzd 就能看见它。于是 zzd 很快就数出了他看到的颜色种数。

α城里的神仙陈老爷想要阻止 zzd 送温暖,立马联合神仙 cly 发动了魔法:不断将高楼重新排列。

这么多的变换,让 zzd 眼花缭乱。于是,zzd 决定,在去找 Mangoyang 并对陈老爷实施 α 行动之前,先问问你:对于所有排列,zzd 看到的颜色种数之和为多少?

答案对 998244353 取模。

输入描述

第一行一个整数 n 。
接下来 n 行,每行两个整数 a[i] 和 c[i] 。
1<=n<=500000,
1<=a[i],c[i]<=100000000

输出描述

一个整数,表示答案对 998244353 取模后的值。

示例
输入1
4
1 5
4 3
5 2
3 1

输出1
50

输入2
10
5 6
1 2
2 2
10 9
10 7
8 6
10 6
1 2
1 1
8 3

输出2
6664320

  不过后来由于 ACM 赛制,样例 2 就没了。

题解

  首先我们把这个总方案数转化成期望。

  根据期望的线性性,总答案可以分解成各个颜色被看见的概率之和。

  现在考虑如何求一个颜色被看见的概率。

  这里有一个结论——

如果对于一个楼,高度不低于它的(包括它自己)有 $t$ 个,那么它被看见的概率就是 $\frac 1t$ 。

  (证明:将当前楼插入比他高的楼的空隙中,有 $t$ 个方法,但是只有插在最前面的是能看见的)

  那么,一种颜色被看见的概率就是 $1-$ 每一个楼都没被看见的概率。注意到可能存在同种颜色有多个相同高度的楼的情况,需要将上面的结论升级一下——

对于 $k$ 个相同高度的楼,如果高度不低于他们的楼有 $t$ 个,则他们中至少一个被看见的概率就是 $\frac kt$

  (证明基于之前的结论,推导一下即可)

  于是就解决了这个问题。

  所以这个通过率是怎么回事……是不是都被某毒瘤出题人的 B 题拦住了?

代码

加了个hash表,成功把时限开到了标程4倍。

#include <bits/stdc++.h>
using namespace std;
const int N=500005,mod=998244353;
int Pow(int x,int y){
int ans=1;
for (;y;y>>=1,x=1LL*x*x%mod)
if (y&1)
ans=1LL*ans*x%mod;
return ans;
}
int read(){
int x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
int n,Fac[N],Inv[N],Ha[N],tax[N],hs=0,tot=0;
struct Building{
int a,c;
}x[N];
struct hash_map{
static const int Ti=233,mod=1<<19;
int cnt,k[mod+1],v[mod+1],nxt[mod+1],fst[mod+1];
int Hash(int x){
unsigned t=x;
int v=(t<<3^t)&(mod-1);
return v==0?mod:v;
}
void clear(){
cnt=0;
memset(fst,0,sizeof fst);
}
void update(int x,int a){
int y=Hash(x);
for (int p=fst[y];p;p=nxt[p])
if (k[p]==x){
v[p]=a;
return;
}
k[++cnt]=x,nxt[cnt]=fst[y],fst[y]=cnt,v[cnt]=a;
return;
}
int find(int x){
int y=Hash(x);
for (int p=fst[y];p;p=nxt[p])
if (k[p]==x)
return v[p];
return 0;
}
int &operator [] (int x){
int y=Hash(x);
for (int p=fst[y];p;p=nxt[p])
if (k[p]==x)
return v[p];
k[++cnt]=x,nxt[cnt]=fst[y],fst[y]=cnt;
return v[cnt]=0;
}
}Map;
vector <int> v[N];
int main(){
//freopen("city9.in","r",stdin);
//freopen("city9.out","w",stdout);
//int st=clock();
n=read();
for (int i=Fac[0]=1;i<=n;i++){
Fac[i]=1LL*Fac[i-1]*i%mod;
v[i].clear();
}
Inv[n]=Pow(Fac[n],mod-2);
for (int i=n;i>=1;i--)
Inv[i-1]=1LL*Inv[i]*i%mod;
for (int i=1;i<=n;i++)
Inv[i]=1LL*Inv[i]*Fac[i-1]%mod;
Map.clear();
for (int i=1;i<=n;i++){
x[i].a=read(),x[i].c=read();
if (!Map[x[i].c])
Map[x[i].c]=++tot;
x[i].c=Map[x[i].c];
Ha[++hs]=x[i].a;
}
sort(Ha+1,Ha+hs+1);
hs=unique(Ha+1,Ha+hs+1)-Ha-1;
memset(tax,0,sizeof tax);
for (int i=1;i<=n;i++){
x[i].a=lower_bound(Ha+1,Ha+hs+1,x[i].a)-Ha;
tax[x[i].a]++;
v[x[i].c].push_back(x[i].a);
}
for (int i=hs;i>=1;i--)
tax[i]+=tax[i+1];
int ans=0;
for (int i=1;i<=tot;i++){
vector <int> &a=v[i];
sort(a.begin(),a.end());
a.push_back(a.back()+1);
int h=a[0],cnt=1,now=1;
for (int j=1;j<a.size();j++){
if (a[j]!=a[j-1]){
int t=tax[a[j-1]];
now=1LL*now*(mod+1-1LL*cnt*Inv[t]%mod)%mod;
cnt=0;
}
cnt++;
}
ans=(ans+mod+1-now)%mod;
}
ans=1LL*ans*Fac[n]%mod;
printf("%d",ans);
//cerr << "user time = " << clock()-st << endl;
return 0;
}

  

数据生成器

里面有参数自行调整。

#include <bits/stdc++.h>
using namespace std;
typedef unsigned uint;
const int N=1000005;
int n=500000,m=1000,A[N],C[N];
int Rand(int n){
uint a=rand(),b=rand();
return (a<<16|b)%n;
}
int main(){
srand(time(NULL));
freopen("city9.in","w",stdout);
printf("%d\n",n);
A[0]=C[0]=1;
for (int i=1;i<=n;i++){
int a,c;
int p1=Rand(20),p2=Rand(20);
if (p1)
a=Rand(m)+1;
else
a=A[Rand(i)];
if (p2)
c=Rand(m)+1;
else
c=C[Rand(i)];
printf("%d %d\n",A[i]=a,C[i]=c);
}
return 0;
}

  

牛客 Wannafly 挑战赛26D 禁书目录 排列组合 概率期望的更多相关文章

  1. 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)

    牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...

  2. 牛客~~wannafly挑战赛19~A 队列

    链接:https://www.nowcoder.com/acm/contest/131/A来源:牛客网 题目描述 ZZT 创造了一个队列 Q.这个队列包含了 N 个元素,队列中的第 i 个元素用 Qi ...

  3. 牛客Wannafly挑战赛23 B.游戏

    游戏 题目描述 小N和小O在玩游戏.他们面前放了n堆石子,第i堆石子一开始有ci颗石头.他们轮流从某堆石子中取石子,不能不取.最后无法操作的人就输了这个游戏.但他们觉得这样玩太无聊了,更新了一下规则. ...

  4. nowcoder牛客wannafly挑战赛20

    A---染色 签到题,设最终颜色为x,一次操作就需要把一个不是x的点变为x,所以最终颜色为x时需要操作 总结点个数-颜色为x的节点个数,然后枚举所有颜色就行了 #include <iostrea ...

  5. 牛客Wannafly挑战赛26E 蚂蚁开会(树链剖分+线段树)

    传送门 题面描述 一颗n个节点的树,m次操作,有点权(该节点蚂蚁个数)和边权(相邻节点的距离). 三种操作: 操作1:1 i x将节点i的点权修改为x.(1 <= i <= n; 1 &l ...

  6. 牛客Wannafly挑战赛11E 白兔的刁难

    传送门 如果大力推单位根反演就可以获得一个 \(k^2logn\) 的好方法 \[ans_{t}=\frac{1}{k}\sum_{i=0}^{k-1}(w_k^{-t})^i(w_k^i+1)^n\ ...

  7. 牛客Wannafly挑战赛23F 计数(循环卷积+拉格朗日插值/单位根反演)

    传送门 直接的想法就是设 \(x^k\) 为边权,矩阵树定理一波后取出 \(x^{nk}\) 的系数即可 也就是求出模 \(x^k\) 意义下的循环卷积的常数项 考虑插值出最后多项式,类比 \(DFT ...

  8. 牛客 Wannafly挑战赛27 D 绿魔法师

    传送门 \(\color{green}{solution}\) 分析下,在\(1e5+1\)内,一个数的约数个数最多为\(2^{6}\)个,所以我们可以考虑枚举约数 复杂度\(O(N^{2^{6 \t ...

  9. [牛客Wannafly挑战赛27D]绿魔法师

    description newcoder 给你一个空的可重集合\(S\). \(n\)次操作,每次操作给出\(x\),\(k\),\(p\),执行以下操作: \(opt\ 1\):在S中加入x. \( ...

随机推荐

  1. yum报错:Error: Multilib version problems found. This often means that the root

    使用yum安装一些依赖库报错: yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel 错误信 ...

  2. STM32L476应用开发之二:模拟量数据采集

    采集模拟量数据在一台一起中是必不可少的功能.在本次实验中我们要采集的模拟量值主要包括氧气传感器的输出以及压力变送器的输出. 1硬件设计 我们需要采集数据对精度有一定的要求,而STM32L476自带AD ...

  3. Confluence 6 代理和 HTTPS 设置连接器

    很多用户选择将 Confluence 运行在反向代理的后面,同时还启用了 HTTPS.将你的的 Confluence 反向代理配置正确就显得非常必要了,并且能够避免后期在使用 Confluence 遇 ...

  4. Confluence 6 中修改默认的表现和内容

    Confluence 构建了一些有用的默认设置,这些设置能够让第一次访问使用 Confluence 系统的用户更好的了解系统.同时默认的内容将新空间和其他区域放置在 Confluence 中. Con ...

  5. Confluence 6 自定义配色方案

    Confluence 的管理员可以修改 Confluence 的色彩配色方案.站点的默认配色方案将会在站点的默认空间上同时生效. 希望修改站点的配色方案: 在屏幕的右上角单击 控制台按钮 ,然后选择  ...

  6. mysql 视图 触发器 事物 存储过程 函数 流程控制

    1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...

  7. BeautifulSoup的基本用法

    # -*- coding:UTF-8 -*- from urllib import request from bs4 import BeautifulSoup import re import sys ...

  8. laravel 表单方法伪造

    有时候,我们可能需要手动定义发送表单数据所使用的 HTTP 请求方式,而 HTML 表单仅支持 GET 和 POST 两种方式,如果要使用其他的方式,则需要自己来定义实现. HTTP 请求方式概述 最 ...

  9. HTML&javaSkcript&CSS&jQuery&ajax(四)

    一.HTML创建响应设计 Responsive Web Design 可以改变尺寸传递网页,对于平板和移动设备是必须的 1.<!DOCTYPE html><html lang=&qu ...

  10. 乘法原理,加法原理,多重集的排列数(多个系列操作穿插的排列数) 进阶指南 洛谷p4778

    https://www.luogu.org/problemnew/solution/P4778 非常好的题目,囊括了乘法加法原理和多重集合排列,虽然最后使用一个结论解出来的.. 给定一个n的排列,用最 ...