禁书目录

题目大意:清教需要定期给Index清除记忆,在此之前需要把当中的十万三千本禁书取出来......不幸的是,禁书一旦离开了Index就非常脆弱,具体来说,每一本禁书都有一个魔力值 ai ,其记载的内容是 bi ,取出后的 n 本不同的禁书形成了一个排列,如果说对于一本禁书 i ,其左边存在一本不弱于它的魔力值的禁书 j ,禁书 i 就会因为禁书 j 的影响而消失。求对于所有可能的禁书排列,能保留下来的记载内容的种类数之和。由于答案可能很大,只需要输出对998244353 取膜后的结果即可。

数据范围:1 ≤ n ≤ 5 x 105, 1≤ ai, bi ≤ 108


题解

这题好啊

第一道数数题转成概率期望的。

主要是,这个题数数没法数,想起来过于憋尿,我们把它变成概率期望。

假设$a$值不小于当前$a$的书有$cnt$本,那么这本书活下来的概率就是$\frac{1}{cnt}$。

所以对于每一种书,算出来全都活不下来的概率,最后乘上阶乘就好了。

需要注意的是,如果出现了两本书完全相同,那么我们就只能统计其中一本因为在后面的书无论如何都会被前面的干掉。

代码

#include <bits/stdc++.h>

#define N 500010 

using namespace std;

typedef long long ll;

const int mod = 998244353 ; 

map<int, int> MP;

struct Node {
int x, y;
}a[N], b[N]; inline bool cmp(const Node &a, const Node &b) {
return a.x == b.x ? a.y < b.y : a.x < b.x;
}
inline bool operator == (const Node &a, const Node &b) {
return a.x == b.x && a.y == b.y;
} char *p1, *p2, buf[100000]; #define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ ) int rd() {
int x = 0;
char c = nc();
while (c < 48) {
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x;
} int qpow(int x, int y) {
int ans = 1;
while (y) {
if (y & 1) {
ans = (ll)ans * x % mod;
}
y >>= 1;
x = (ll)x * x % mod;
}
return ans;
} int c[N << 1], cnt, re[N << 1]; int main() {
int n = rd();
int sum = 1;
for (int i = 1; i <= n; i ++ ) {
sum = (ll)sum * i % mod;
}
for (int i = 1; i <= n; i ++ ) {
a[i].x = rd(), a[i].y = rd();
c[ ++ cnt] = a[i].x, c[ ++ cnt] = a[i].y;
}
int tot = 0;
sort(c + 1, c + cnt + 1);
c[0] = c[1] - 1;
for (int i = 1; i <= cnt; i ++ ) {
if (c[i] != c[i - 1]) {
MP[c[i]] = ++tot;
}
}
for (int i = 1; i <= n; i ++ ) {
a[i].x = MP[a[i].x], a[i].y = MP[a[i].y];
} sort(a + 1, a + n + 1, cmp);
int pre = 0;
for (int i = 1; i <= tot; i ++ ) {
re[i] = 1;
}
for (int i = 1; i <= n; i ++ ) {
int dic = i;
while (dic < n && a[dic] == a[dic + 1]) {
dic ++ ;
}
if (a[i].x != a[pre].x) {
pre = i;
}
int mdl = n - pre + 1;
re[a[dic].y] = (ll)re[a[dic].y] * (mdl - (dic - i + 1)) % mod * qpow(mdl, mod - 2) % mod;
i = dic;
}
int ans = 0;
for (int i = 1; i <= tot; i ++ ) {
ans = (ans + (1 - re[i] + mod) % mod) % mod;
}
cout << (ll)ans * sum % mod << endl ;
return 0;
}

小结:好题啊,这个题感觉很有意义的。就是如果碰见了一道数数题完全没思路(及时模数很有诱惑力),我们可以考虑转化成概率期望来做。

[Nowcoder212D]禁书目录_概率期望的更多相关文章

  1. [bzoj5483][Usaco2018 Dec]Balance Beam_凸包_概率期望

    bzoj5483 Usaco2018Dec Balance Beam 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=5483 数据范围:略. 题解 ...

  2. [LuoguP2164][SHOI2007]交通网络_拓扑排序_概率期望

    交通网络 题目链接:https://www.luogu.org/problemnew/solution/P2164 数据范围:略. 题解: 直接算不好算,我们考虑建反图然后$Toposort$. 这样 ...

  3. [计蒜客T2238]礼物_线段树_归并排序_概率期望

    礼物 题目大意: 数据范围: 题解: 这题有意思啊($md$卡常 直接做怎么做? 随便上个什么东西,维护一下矩阵乘和插入,比如说常数还算小的$KD-Tree$(反正我是没见人过过 我们漏掉了一个条件, ...

  4. BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望

    BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这 ...

  5. 概率与期望详解!一次精通oi中的概率期望

    目录 基础概念 最大值不超过Y的期望 概率为P时期望成功次数 基础问题 拿球 随机游走 经典问题 期望线性性练习题 例题选讲 noip2016换教室 区间交 0-1边树求直径期望 球染色 区间翻转 二 ...

  6. BZOJ_3566_[SHOI2014]概率充电器_概率+树形DP

    BZOJ_3566_[SHOI2014]概率充电器_概率+树形DP Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技 ...

  7. BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs

    BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...

  8. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

  9. uvalive 7331 Hovering Hornet 半平面交+概率期望

    题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望. 思路:半平面交+概率期望 #include<cstdio> #include<cstring> ...

随机推荐

  1. laravel事件监听器

    在EventServiceProvide文件里注册事件和监听 protected $listen = [ 'App\Events\SendPhoneCodeEvent' => [ 'App\Li ...

  2. Luogu P1903 [国家集训队]数颜色 or 维护队列

    标准的带修莫队...咕到了现在$qwq$ 莫队是对询问排序来优化复杂度的(不带修就是对询问区间$[l,r]$排序).. 那么现在带修了,我们再可以维护一个时间维度$tm$:对于每个询问,每次回答前先检 ...

  3. PHP mysqli_fetch_fields() 函数

    mysqli_fetch_fields() 函数返回结果集中代表字段(列)的对象的数组. 返回结果集中代表字段(列)的对象的数组,然后输出每个字段名称.表格和最大长度: <?php // 假定数 ...

  4. FFT算法理解与c语言的实现

    完整内容迁移至 http://www.face2ai.com/DIP-2-3-FFT算法理解与c语言的实现/ http://www.tony4ai.com/DIP-2-3-FFT算法理解与c语言的实现 ...

  5. 简易的学生成绩管理系统(C++实现)

    最近浅显的学习了C++的基础知识,想来练练手,于是就用单链表写了最经典的小项目,存粹学习,所以就在控制台下写了,写的有点简陋,码了大概400多行. 下面上代码: #include <cstdli ...

  6. premiere pro 2019 mac 破解

    链接:https://pan.baidu.com/s/14p1qj6pI1F3SP1SG4TUFHA  密码:seug

  7. kdc 互信

    环境: 29.3.203.53(sysops00065017) 部署KDC Namnode Datanode,KDC负责TESTA.COM域的认证 29.3.203.54(sysops00065018 ...

  8. 8.5 JavaScript的BOM(二)

    8.5 JavaScript的BOM 即 浏览器对象模型(Browser Object Model) 浏览器对象包括 一.Window(窗口) 如果需要打开一个新的网站,应该通过超级链接等方式让用户主 ...

  9. csp-s模拟84

    T1: 考虑如何能按顺序生成光滑数.对每个质数用队列维护包含此质数的候选集合,每次从所有队首取出最小的作为一个光滑数,用每个质数乘上这个光滑数并加入相应候选集合.这样不会漏掉一个光滑数,但会有重复.比 ...

  10. python Telnet通讯

    摘要: python中telnetlib模块的使用: http://blog.csdn.net/five3/article/details/8099997 python实现telnet: http:/ ...