D. Rescue Nibel! 解析(思維、組合、離散化、差分)
Codeforce 1420 D. Rescue Nibel! 解析(思維、組合、離散化、差分)
今天我們來看看CF1420D
題目連結
題目
給你\(n\)個區間,求有幾種方法使得\(k\)個區間的交集非空。
前言
組合不會算,也想不到離散化
想法
首先需要找個依據來枚舉開始計算,而我們可以觀察到:對於任何一個\(k\)個區間的交集,這個交集的左界一定是某個區間的左界,也就是說我們可以枚舉交集所有可能的左界,把答案加總即可。
而假設要計算交集從\(i\)開始的方法數,我們必須知道究竟有多少個區間有包含這個左界,但是\(l_i,r_i\le10^9\)實在太大了,即使我們做差分也時間不夠,因此我們需要離散化整個座標軸。
差分即是:\(cnt[左界]++,cnt[右界+1]--\),如此一來只要把整個\(cnt\)數列做前綴和,其結果就是每個點被覆蓋的次數。
離散化:我們先把所有\(l_i,r_i\)丟進一個\(vector\)裡,並且只留下相異元素、排序,如此一來某原始座標\(x\)的離散化後的座標即是\(lower\_bound(vector_{start},vector_{end},x)\)。
我們還需要紀錄:對於每一個座標,有多少左界從這開始。
如此一來,我們只要遍歷所有座標點,答案加上:(覆蓋的區間中選\(k\)個的方法數\(-\)沒選到從當前座標開始的區間的方法數),就可以算出答案。
而還有一個難點即是計算組合數。我們可以先愈處理所有\(x!\)的數值和模反元素(計算模反元素可以用Fermat's Little Theorem:\(a^{p-1}\equiv1\mod p\),因為\(998244353\)是質數,所以\(a^{p-2}\equiv a^{-1}\mod p\)),接著就用一般的公式計算即可。
程式碼:
const int _n=3e5+10;
int t,n,k,cnt[_n<<1],num[_n<<1];
PII la[_n];
VI v;
int fac[_n],inv[_n];
void exgcd(int a,int b,int& d,int& x,int& y){
if(!b)x=1,y=0,d=a;
else exgcd(b,a%b,d,y,x),y=(1ll*y-1ll*x*(a/b)%mod+mod)%mod;
}
int C(int m,int n){
if(m<n)return 0;
if(m<mod and n<mod)return 1ll*fac[m]*inv[n]%mod*inv[m-n]%mod;
return 1ll*C(m/mod,n/mod)*C(m%mod,n%mod)%mod;
}
void genInv(){
fac[0]=1;rep(i,1,n+1)fac[i]=1ll*fac[i-1]*i%mod;
//int tmp1,tmp2;rep(i,0,n+1)exgcd(fac[i],mod,tmp1,inv[i],tmp2);
inv[n]=powmod(fac[n],mod-2);per(i,0,n)inv[i]=1ll*inv[i+1]*(i+1)%mod;
}
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>k;rep(i,0,n){cin>>la[i].fi>>la[i].se;v.pb(la[i].fi),v.pb(la[i].se);}
sort(all(v));int nn=unique(all(v))-v.begin(); genInv(); ll ans=0;
rep(i,0,n){
la[i].fi=lower_bound(v.begin(),v.begin()+nn,la[i].fi)-v.begin();
la[i].se=lower_bound(v.begin(),v.begin()+nn,la[i].se)-v.begin();
}rep(i,0,n)cnt[la[i].fi]++,cnt[la[i].se+1]--,num[la[i].fi]++;
rep(i,1,nn)cnt[i]=cnt[i-1]+cnt[i];
rep(i,0,nn)ans=(ans+C(cnt[i],k)-C(cnt[i]-num[i],k)+mod)%mod;
cout<<ans<<'\n';
return 0;
}
標頭、模板請點Submission看(\(exgcd\)用不到,且\(C\)函數我寫的是Lucas定理法)
Submission
D. Rescue Nibel! 解析(思維、組合、離散化、差分)的更多相关文章
- D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)
Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...
- B. Two Fairs 解析(思維、DFS、組合)
Codeforce 1276 B. Two Fairs 解析(思維.DFS.組合) 今天我們來看看CF1276B 題目連結 題目 給一個連通圖,並給兩個點(\(a,b\)),求有多少點對使得:任一路徑 ...
- D. Maximum Distributed Tree 解析(思維、DFS、組合、貪心、DP)
Codeforce 1401 D. Maximum Distributed Tree 解析(思維.DFS.組合.貪心.DP) 今天我們來看看CF1401D 題目連結 題目 直接看原題比較清楚,略. 前 ...
- A. Arena of Greed 解析(思維)
Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...
- E. Almost Regular Bracket Sequence 解析(思維)
Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...
- C2. Power Transmission (Hard Edition) 解析(思維、幾何)
Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...
- F. Moving Points 解析(思維、離散化、BIT、前綴和)
Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...
- B. Two Arrays 解析(思維)
Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...
- C. k-Amazing Numbers 解析(思維)
Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...
随机推荐
- l洛谷 P6030 [SDOI2012]走迷宫 概率与期望+高斯消元
题目描述 传送门 分析 首先判掉 \(INF\) 的情况 第一种情况就是不能从 \(s\) 走到 \(t\) 第二种情况就是从 \(s\) 出发走到了出度为 \(0\) 的点,这样就再也走不到 \(t ...
- CentOS 8 安装 VirtualBox 增强功能
环境介绍 Machine: NUC8i5BEK OS: macOS Catalina 10.15.6 VirtualBox: 6.1.12 r139181 (Qt5.6.3) CentOS: 8.2. ...
- python+pymysql访问mysql数据库
今天跟大家分享两种场景的python连接MySQL方法: 场景一:连接远程MySQL 首先,安装pymysql:在命令行执行pip install pymysql指令. 然后,导入pymysql: i ...
- 基础篇:深入解析JAVA反射机制
目录 反射的概念 获取Class的三种方法 JAVA反射API 反射机制应用的场景 反射和JDK动态代理 欢迎指正文中错误 关注公众号,一起交流 参考文章 反射的概念 java的放射机制:在程序运行时 ...
- Java集合-07Map接口及其抽象类
简介 前面把List基本记录完了,对于集合List,Map,Set,因为Set基于Map,故先记录Map. 这一篇主要记录Map接口及其抽象类(java version:1.8) 整体架构 参考上图, ...
- Unity Shader 00 - 梳理 Unity Shader 的基本结构
0x00 写在前面 之前一直在阅读 The Book of Shaders 一书,为什么会开始写 Unity Shader 呢?一方面,因为该书目前尚未完结,写下此文时已阅读到该书的最新章节:另一方面 ...
- c++中sprintf和sprintf_s的区别
参考:https://blog.csdn.net/qq_37221466/article/details/81140901 sprintf_s是sprintf的安全版本,指定缓冲区长度来避免sprin ...
- python中np.arrange用法
转载:https://www.cnblogs.com/ghllfl/p/8487692.html np.arange()经常用,其用法总结如下: np.arange(0,60,2) 生成从0到60的步 ...
- 一文搞懂PV、UV、VV、IP及其关系与计算
写在前面 十一长假基本上过去了,很多小伙伴在假期当中还是保持着持续学习的心态,也有不少小伙伴在微信上问我,让我推送相关的文章.这个时候,我都是抽空来整理小伙伴们的问题,然后,按照顺序进行推文. PS: ...
- 强大的table组件-antd pro table
概述 antd pro table antd pro table 的主要部分 表格显示的配置(绿色框内) 检索的配置(红色框内) 是否显示检索部分 检索的内容是如何生效的 工具栏的配置(黄色框内) 表 ...