任意门:http://codeforces.com/contest/689/problem/E

E. Mike and Geometry Problem

time limit per test

3 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Mike wants to prepare for IMO but he doesn't know geometry, so his teacher gave him an interesting geometry problem. Let's define f([l, r]) = r - l + 1 to be the number of integer points in the segment [l, r] with l ≤ r (say that ). You are given two integers nand k and n closed intervals [li, ri] on OX axis and you have to find:

In other words, you should find the sum of the number of integer points in the intersection of any k of the segments.

As the answer may be very large, output it modulo 1000000007 (109 + 7).

Mike can't solve this problem so he needs your help. You will help him, won't you?

Input

The first line contains two integers n and k (1 ≤ k ≤ n ≤ 200 000) — the number of segments and the number of segments in intersection groups respectively.

Then n lines follow, the i-th line contains two integers li, ri ( - 109 ≤ li ≤ ri ≤ 109), describing i-th segment bounds.

Output

Print one integer number — the answer to Mike's problem modulo 1000000007 (109 + 7) in the only line.

Examples
input

Copy
3 2
1 2
1 3
2 3
output

Copy
5
input

Copy
3 3
1 3
1 3
1 3
output

Copy
3
input

Copy
3 1
1 2
2 3
3 4
output

Copy
6
Note

In the first example:

;

;

.

So the answer is 2 + 1 + 2 = 5.

大概题意:

有 N 个区间, 从其中取 K 个区间。所以有 C(N, K)种组合, 求每种组合区间交集长度的总和。

解题思路:

丢开区间的角度,从每个结点的角度来看,其实每个结点的贡献是 C(cnt, K) cnt 为该结点出现的次数, 所以只要O(N)扫一遍统计每个结点的贡献就是答案。

思路清晰,但考虑到数据的规模,这里需要注意和需要用到两个技巧:

一是离散化,这里STL里的 vector 和 pair 结合用,结合区间加法的思想进行离散化。

二是求组合数时 除数太大,考虑到精度问题需要用逆元来计算。

AC code:

 #include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+;
const int mod = 1e9+;
long long fac[maxn]; long long qpow(long long a,long long b) //快速幂
{
long long ans=;a%=mod;
for(long long i=b;i;i>>=,a=a*a%mod)
if(i&)ans=ans*a%mod;
return ans;
} long long C(long long n,long long m) //计算组合数
{
if(m>n||m<)return ;
long long s1=fac[n], s2=fac[n-m]*fac[m]%mod; //除数太大,逆元处理
return s1*qpow(s2,mod-)%mod;
}
int n,k;
int l[maxn],r[maxn]; //左端点, 右端点
int main()
{
fac[]=;
for(int i=;i<maxn;i++) //预处理全排列
fac[i]=fac[i-]*i%mod; scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%d",&l[i]);
scanf("%d",&r[i]);
}
vector<pair<int,int> >op;
for(int i=;i<=n;i++){ //离散化
op.push_back(make_pair(l[i]-,)); //区间加法标记
op.push_back(make_pair(r[i],-));
}
sort(op.begin(),op.end()); //升序排序
long long ans = ; //初始化
int cnt=;
int la=-2e9;
for(int i=;i<op.size();i++){ //计算每点的贡献
ans=(ans+C(cnt,k)*(op[i].first-la))%mod;
la=op[i].first;
cnt+=op[i].second; //该点的前缀和就是该点的出现次数
}
cout<<ans<<endl;
}

Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 && 离散化】的更多相关文章

  1. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 离散化 排列组合

    E. Mike and Geometry Problem 题目连接: http://www.codeforces.com/contest/689/problem/E Description Mike ...

  2. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 离散化+逆元

    E. Mike and Geometry Problem time limit per test 3 seconds memory limit per test 256 megabytes input ...

  3. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem

    题目链接:传送门 题目大意:给你n个区间,求任意k个区间交所包含点的数目之和. 题目思路:将n个区间都离散化掉,然后对于一个覆盖的区间,如果覆盖数cnt>=k,则数目应该加上 区间长度*(cnt ...

  4. Codeforces Round #410 (Div. 2)C. Mike and gcd problem

    题目连接:http://codeforces.com/contest/798/problem/C C. Mike and gcd problem time limit per test 2 secon ...

  5. Codeforces Round #361 (Div. 2) C. Mike and Chocolate Thieves 二分

    C. Mike and Chocolate Thieves 题目连接: http://www.codeforces.com/contest/689/problem/C Description Bad ...

  6. Codeforces Round #361 (Div. 2) B. Mike and Shortcuts bfs

    B. Mike and Shortcuts 题目连接: http://www.codeforces.com/contest/689/problem/B Description Recently, Mi ...

  7. Codeforces Round #361 (Div. 2) A. Mike and Cellphone 水题

    A. Mike and Cellphone 题目连接: http://www.codeforces.com/contest/689/problem/A Description While swimmi ...

  8. Codeforces Round #361 (Div. 2)——B. Mike and Shortcuts(BFS+小坑)

    B. Mike and Shortcuts time limit per test 3 seconds memory limit per test 256 megabytes input standa ...

  9. Codeforces Round #361 (Div. 2)A. Mike and Cellphone

    A. Mike and Cellphone time limit per test 1 second memory limit per test 256 megabytes input standar ...

随机推荐

  1. 踩坑--http返回码之302状态码

    项目介绍:springboot+shiro+maven 业务需求:拦截一切不登录的盗链URL,除了问卷调查,可以给任意用户填写和提交意外. 问题重现:表单提交过程中返回302状态码,我就觉得很奇怪.在 ...

  2. MVC参数自动装配

    在拿到一个类型的所有属性以及字段的描述信息后,就可以通过循环的方式,根据这些数据成员的名字去QueryString,Form,Session,Cookie读取所需的数据了. 就是遍历参数,然后用反射遍 ...

  3. 基于原生态Hadoop2.6 HA集群环境的搭建

    hadoop2.6  HA平台搭建   一.条件准备 软件条件: Ubuntu14.04 64位操作系统, jdk1.7 64位,Hadoop 2.6.0,  zookeeper 3.4.6 硬件条件 ...

  4. 安装wine

    sudo add-apt-repository ppa:ubuntu-wine/ppa sudo apt-get update sudo apt-get install  winetricks

  5. vue-cli 3.x安装配置步骤详细说明

      一.vue-cli 3.x简单介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统:是一个类似于 create-react-app 的可以用例命令行快速配置和生成一个 vue 项 ...

  6. Ubuntu通过xinput禁用及启用联想笔记本的触摸板

    查看设备列表 通过xinput先查看一些都有哪些设备 xinput     #或者 xinput list 显示结果如下 ddd@ddd:~$ xinput list   Virtual core p ...

  7. mysql 索引、查询优化

    查询计划Explain mysql查询过程中,如若想了解当前sql的执行计划,可以通过explain your_sql的方式查看,具体可以参考mysql官方解释:https://dev.mysql.c ...

  8. 一、IP地址

    IP地址 1)网络地址 IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络. 2)广播地址 广播地址通常称为直接广播地址,是为了区分受限广播地址. 广播地址与网 ...

  9. jquery监控input输入框的变化

    (function($) { $.fn.watch = function(callback) { return this.each(function() { //缓存以前的值 $.data(this, ...

  10. webpack+babel+react操作小结

    最近学习了一下Webpack,个人感觉还是非常实用的,现在总结一下自己的学习笔记. 什么是 Webpack Webpack 是一个模块打包器.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定 ...