禁书目录

题目大意:清教需要定期给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. (九)文档和视图,Invalidate,数据库编程

    一.文档视图结构 文档类(CDocument):存储加载(读写)数据视图类(CView):显示和修改数据 1)单文档 a)文档模板:把框架窗口.文档.视图关联在一起b)文档类(CDocument): ...

  2. SCOI2014 bzoj3594 方伯伯的玉米田(二维树状数组+dp)

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1971  Solved: 961[Submit][St ...

  3. 【原创】洛谷 LUOGU P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...

  4. jQuery系列(十):事件对象

    1.事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. (1)什么时候会产生Event 对象呢? 例如: 当用户单击某个元素的时候,我们给 ...

  5. 数据结构实验之栈与队列一:进制转换(SDUT 2131)

    题目链接 题解: 特判一下n==0的时候. #include <bits/stdc++.h> using namespace std; int a[1000]; int main() { ...

  6. luogu4281

    P4281 [AHOI2008]紧急集合 / 聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”.在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道 ...

  7. 小程序和vue的区别

    最近开发了一个比较完整的小程序项目,打算总结一下,小程序开发和vue开发的代码上的区别 1.小程序的路由写在app.json文件里,vue写在route.js里 2.小程序用 src="{{ ...

  8. 第二届强网杯部分题writeup

    0x00 题目名称 签到 操作内容:   FLAG值: flag{welcome_to_qwb} 0x01 题目名称 Weclome 操作内容: 通过查看文件发现是一个bmp格式的图片文件,然后加上后 ...

  9. windows下安装MongoDB服务

    1,参考:https://www.cnblogs.com/lecaf/p/mongodb.html 2,要设置环境变量 3,设置用户 use admin  注:MongoDB安装好以后由默认的admi ...

  10. Qt控制台输出QString

    有时候想在控制台输出我们想要的QString变量. 1.qDebug可以实现在控制台终端打印,但我们还是想使用C++中的std::cout<<variable This function ...