传送门

首先,对于每一块墓地,如果上下左右各有$a,b,c,d$棵树,那么总的虔诚度就是$C_k^a*C_k^b*C_k^c*C_k^d$

那么我们先把所有的点都给离散,然后按$x$为第一关键字,$y$为第二关键字,那么同一横坐标的一定在连续的一段且纵坐标递增

那么对于同一横坐标的两棵常青树,在他们中间的所有空地都有可能满足条件,因为上面的常青树和下面的常青树数量是固定的,所以$C_k^a*C_k^b$的值也是固定的

那么我们就是需要快速求出一段区间里的$C_k^c*C_k^d$,那么我们可以考虑用树状数组来维护。这部分细节可以参考代码

 //minamoto
#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=,mod=;
int n,m,k,C[N][],tt=,ans,tmp[N],c[N],col,tot[N],cnt[N],r[N],h[N];
struct node{int x,y;}a[N];
inline bool cmp(const node &a,const node &b)
{return a.x!=b.x?a.x<b.x:a.y<b.y;}
inline bool cmp2(const node &a,const node &b)
{return a.y!=b.y?a.y<b.y:a.x<b.x;}
inline void add(int x,int y){
for(;x<=col;x+=x&-x) (c[x]+=y)%=mod;
}
inline int query(int x){
int res=;
for(;x;x-=x&-x) (res+=c[x])%=mod;
return res;
}
signed main(){
//freopen("testdata.in","r",stdin);
read();read();n=read();
for(int i=;i<=n;++i) a[i].x=read(),a[i].y=read();
k=read();
for(int i=;i<=n;++i) C[i][]=;
for(int i=;i<=n;++i)
for(int j=;j<=min(i,k);++j)
C[i][j]=C[i-][j]+C[i-][j-];
sort(a+,a++n,cmp2);
for(int i=;i<=n;++i)
tmp[i]=(i==||a[i].y!=a[i-].y)?++tt:tt;
for(int i=;i<=n;++i) cnt[a[i].y=tmp[i]]++;col=a[n].y;
sort(a+,a++n,cmp);
for(int i=;i<=n;++i)
tmp[i]=(i==||a[i].x!=a[i-].x)?++tt:tt;
for(int i=;i<=n;++i) tot[a[i].x=tmp[i]]++;
for(int i=;i<=n;++i){
if(i==||a[i].x!=a[i-].x) tt=;
int dy=a[i].y,v=(++h[dy])>=k&&cnt[dy]-h[dy]>=k?
1ll*C[h[dy]][k]*C[cnt[dy]-h[dy]][k]%mod:;++tt;
add(dy,v-r[dy]),r[dy]=v;
if(i==n||a[i].x!=a[i+].x||a[i+].y-a[i].y<=
||tt<k||tot[a[i].x]-tt<k) continue;
(ans+=1ll*C[tt][k]*C[tot[a[i].x]-tt][k]%mod
*(query(a[i+].y-)-query(a[i].y)))%=mod;
}
printf("%d\n",(ans>=?ans:ans+mod)%mod);
return ;
}

最新文章

  1. 超大 Cookie 拒绝服务攻击
  2. Xcode 属性面板添加自定义控件属性
  3. iOS 学习 - 20 UICollectionView 移动 Item ,类似背包
  4. Kotlin语法(基础)
  5. python使用open经常报错:TypeError: an integer is required的解决方案
  6. ios改变系统默认样式
  7. ACdream 1020 The Game about KILL
  8. magento模板中XML与phtml关系 [四]
  9. JavaScript中的坑--全局变量惹得祸
  10. ③bootstrap文本使用基础案例
  11. 小白的Python之路 day1 模块初识
  12. c#下载文件选择路径控件
  13. APPLE-SA-2019-3-25-4 Safari 12.1
  14. petapoco 实体中字段去掉关联(类似于EF中的NotMap)
  15. List删除
  16. centos7下安装docker(17.1docker监控---sysdig)
  17. Git与GitHub学习笔记(六)使用 Github Pages 管理项目文档
  18. autolayout后获取frame
  19. 机器学习实战-ch2-有标签的聚类算法
  20. Ubuntu下允许Root用户的操作 (图形界面登录、su切换……)

热门文章

  1. php mysqli_get_server_version()函数
  2. gcc 4.8.5安装
  3. python实现无序列表:链表
  4. 【leetcode刷题笔记】Recover Binary Search Tree
  5. luogu1336 最佳课题选择
  6. 【JVM】java棧
  7. DEBUG命令说明
  8. CSS禁止鼠标事件---pointer-events:none
  9. JavaScript继承与聚合
  10. /*带动画效果的hover*/