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! 解析(思維、組合、離散化、差分)的更多相关文章

  1. D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)

    Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...

  2. B. Two Fairs 解析(思維、DFS、組合)

    Codeforce 1276 B. Two Fairs 解析(思維.DFS.組合) 今天我們來看看CF1276B 題目連結 題目 給一個連通圖,並給兩個點(\(a,b\)),求有多少點對使得:任一路徑 ...

  3. D. Maximum Distributed Tree 解析(思維、DFS、組合、貪心、DP)

    Codeforce 1401 D. Maximum Distributed Tree 解析(思維.DFS.組合.貪心.DP) 今天我們來看看CF1401D 題目連結 題目 直接看原題比較清楚,略. 前 ...

  4. A. Arena of Greed 解析(思維)

    Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...

  5. E. Almost Regular Bracket Sequence 解析(思維)

    Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...

  6. C2. Power Transmission (Hard Edition) 解析(思維、幾何)

    Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...

  7. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

  8. B. Two Arrays 解析(思維)

    Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...

  9. C. k-Amazing Numbers 解析(思維)

    Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...

随机推荐

  1. l洛谷 P6030 [SDOI2012]走迷宫 概率与期望+高斯消元

    题目描述 传送门 分析 首先判掉 \(INF\) 的情况 第一种情况就是不能从 \(s\) 走到 \(t\) 第二种情况就是从 \(s\) 出发走到了出度为 \(0\) 的点,这样就再也走不到 \(t ...

  2. CentOS 8 安装 VirtualBox 增强功能

    环境介绍 Machine: NUC8i5BEK OS: macOS Catalina 10.15.6 VirtualBox: 6.1.12 r139181 (Qt5.6.3) CentOS: 8.2. ...

  3. python+pymysql访问mysql数据库

    今天跟大家分享两种场景的python连接MySQL方法: 场景一:连接远程MySQL 首先,安装pymysql:在命令行执行pip install pymysql指令. 然后,导入pymysql: i ...

  4. 基础篇:深入解析JAVA反射机制

    目录 反射的概念 获取Class的三种方法 JAVA反射API 反射机制应用的场景 反射和JDK动态代理 欢迎指正文中错误 关注公众号,一起交流 参考文章 反射的概念 java的放射机制:在程序运行时 ...

  5. Java集合-07Map接口及其抽象类

    简介 前面把List基本记录完了,对于集合List,Map,Set,因为Set基于Map,故先记录Map. 这一篇主要记录Map接口及其抽象类(java version:1.8) 整体架构 参考上图, ...

  6. Unity Shader 00 - 梳理 Unity Shader 的基本结构

    0x00 写在前面 之前一直在阅读 The Book of Shaders 一书,为什么会开始写 Unity Shader 呢?一方面,因为该书目前尚未完结,写下此文时已阅读到该书的最新章节:另一方面 ...

  7. c++中sprintf和sprintf_s的区别

    参考:https://blog.csdn.net/qq_37221466/article/details/81140901 sprintf_s是sprintf的安全版本,指定缓冲区长度来避免sprin ...

  8. python中np.arrange用法

    转载:https://www.cnblogs.com/ghllfl/p/8487692.html np.arange()经常用,其用法总结如下: np.arange(0,60,2) 生成从0到60的步 ...

  9. 一文搞懂PV、UV、VV、IP及其关系与计算

    写在前面 十一长假基本上过去了,很多小伙伴在假期当中还是保持着持续学习的心态,也有不少小伙伴在微信上问我,让我推送相关的文章.这个时候,我都是抽空来整理小伙伴们的问题,然后,按照顺序进行推文. PS: ...

  10. 强大的table组件-antd pro table

    概述 antd pro table antd pro table 的主要部分 表格显示的配置(绿色框内) 检索的配置(红色框内) 是否显示检索部分 检索的内容是如何生效的 工具栏的配置(黄色框内) 表 ...