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 ...
随机推荐
- 运行时数据区--程序计数器(PC Register)
程序计数器(PC Register) 这里的计数器(Program Counter Register)并非为广义上所指的物理寄存器,JVM中的PC寄存器(程序计数器)是对物理PC寄存器的一种抽象模拟, ...
- Redis中LIST列表的相关命令
Redis中LIST列表的相关命令 添加 lpush 将一个或多个value插入到key的表头,如果存在多个value,那么各个value按从左到右的顺序依次插入表头 插入表头:意味着新插入的值在最前 ...
- 解析形如(k,v)(k,v)(k,v)字符串
有时根据需要会将map数据格式化成(k,v)(k,v)(k,v)--字符串,之后需要还原,下面代码实现了还原过程 1 void SplitString(const string& s, vec ...
- java中类的构造及其使用
class Person{ // 属性 public String name; public int age; // 构造方法 public Person(){ ...
- 什么是Python???
1.python是一种解释型语言,这就是说python不用像C语言或者C的衍生语言那样在执行前进行编译. 2.Python是一种动态类型的语言,就是python支持x = 111或者x="1 ...
- 这么设计,Redis 10亿数据量只需要100MB内存
本文主要和大家分享一下redis的高级特性:bit位操作. 本文redis试验代码基于如下环境: 操作系统:Mac OS 64位 版本:Redis 5.0.7 64 bit 运行模式:standalo ...
- Azure Storage 系列(七)使用Azure File Storage
一,引言 今天我们开始介绍 Storage 中的最后一个类型的存储----- File Storage(文件存储),Azure File Storage 在云端提供完全托管的文件共享,这些共享项可通过 ...
- 坐标下降(Coordinate descent)
坐标下降法属于一种非梯度优化的方法,它在每步迭代中沿一个坐标的方向进行线性搜索(线性搜索是不需要求导数的),通过循环使用不同的坐标方法来达到目标函数的局部极小值.
- 完全小白入门:python的下载和安装
1. 打开官网www.python.org,选择Downloads
- 在Windows7中打开照片,提示“Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足。....”
在Windows7中打开照片,提示"Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足.请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果硬盘几乎已满),然后重试. ...