您的位置:首页 > 其它

Codeforces Round #361 (Div. 2) 套题

2016-07-11 14:22 155 查看
A - Mike and Cellphone

问有没有多解,每个点按照给出的序列用向量法跑一遍

#include <vector>
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N=2e5+5;
const LL mod=1e9+7;
struct Segment{
int l,r;
}p
;
int pos[N*2],n,k,tot,a[N*2],b[2*N];
LL dp
,fac
,inv
;
LL quick_pow(LL a,LL num){
LL ret=1;
while(num){
if(num&1)ret=(ret*a)%mod;
num>>=1;
a=(a*a)%mod;
}
return ret;
}
LL C(LL n,LL m){
return (fac
*inv[n-m])%mod*inv[m]%mod;
}
int main()
{
scanf("%d%d",&n,&k);
inv[0]=fac[0]=1;
for(int i=1;i<=n;++i){
fac[i]=1ll*i*fac[i-1]%mod;
inv[i]=quick_pow(fac[i],mod-2);
}
for(int i=1;i<=n;++i){
scanf("%d%d",&p[i].l,&p[i].r);
pos[++tot]=p[i].l;
pos[++tot]=p[i].r;
}
sort(pos+1,pos+1+tot);
tot=unique(pos+1,pos+1+tot)-pos-1;
for(int i=1;i<=n;++i){
p[i].l=lower_bound(pos+1,pos+1+tot,p[i].l)-pos;
p[i].r=lower_bound(pos+1,pos+1+tot,p[i].r)-pos;
++a[p[i].l],--b[p[i].r];
}
for(int i=1;i<=tot;++i){
a[i]+=a[i-1];
++dp[a[i]];
if(i!=1)dp[a[i-1]]+=max(0,pos[i]-pos[i-1]-1);
a[i]+=b[i];
}
LL ret=0;
for(int i=k;i<=n;++i){
ret=(ret+dp[i]*C(i,k)%mod)%mod;
}
printf("%I64d\n",ret);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: