传送门

首先,对于每一块墓地,如果上下左右各有$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$,那么我们可以考虑用树状数组来维护。这部分细节可以参考代码

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #define int long long
 6 using namespace std;
 7 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 8 char buf[1<<21],*p1=buf,*p2=buf;
 9 inline int read(){
10     #define num ch-'0'
11     char ch;bool flag=0;int res;
12     while(!isdigit(ch=getc()))
13     (ch=='-')&&(flag=true);
14     for(res=num;isdigit(ch=getc());res=res*10+num);
15     (flag)&&(res=-res);
16     #undef num
17     return res;
18 }
19 const int N=100005,mod=2147483648;
20 int n,m,k,C[N][15],tt=0,ans,tmp[N],c[N],col,tot[N],cnt[N],r[N],h[N];
21 struct node{int x,y;}a[N];
22 inline bool cmp(const node &a,const node &b)
23 {return a.x!=b.x?a.x<b.x:a.y<b.y;}
24 inline bool cmp2(const node &a,const node &b)
25 {return a.y!=b.y?a.y<b.y:a.x<b.x;}
26 inline void add(int x,int y){
27     for(;x<=col;x+=x&-x) (c[x]+=y)%=mod;
28 }
29 inline int query(int x){
30     int res=0;
31     for(;x;x-=x&-x) (res+=c[x])%=mod;
32     return res;
33 }
34 signed main(){
35     //freopen("testdata.in","r",stdin);
36     read();read();n=read();
37     for(int i=1;i<=n;++i) a[i].x=read(),a[i].y=read();
38     k=read();
39     for(int i=0;i<=n;++i) C[i][0]=1;
40     for(int i=1;i<=n;++i)
41     for(int j=1;j<=min(i,k);++j)
42     C[i][j]=C[i-1][j]+C[i-1][j-1];
43     sort(a+1,a+1+n,cmp2);
44     for(int i=1;i<=n;++i)
45     tmp[i]=(i==1||a[i].y!=a[i-1].y)?++tt:tt;
46     for(int i=1;i<=n;++i) cnt[a[i].y=tmp[i]]++;col=a[n].y;
47     sort(a+1,a+1+n,cmp);
48     for(int i=1;i<=n;++i)
49     tmp[i]=(i==1||a[i].x!=a[i-1].x)?++tt:tt;
50     for(int i=1;i<=n;++i) tot[a[i].x=tmp[i]]++;
51     for(int i=1;i<=n;++i){
52         if(i==1||a[i].x!=a[i-1].x) tt=0;
53         int dy=a[i].y,v=(++h[dy])>=k&&cnt[dy]-h[dy]>=k?
54         1ll*C[h[dy]][k]*C[cnt[dy]-h[dy]][k]%mod:0;++tt;
55         add(dy,v-r[dy]),r[dy]=v;
56         if(i==n||a[i].x!=a[i+1].x||a[i+1].y-a[i].y<=1
57         ||tt<k||tot[a[i].x]-tt<k) continue;
58         (ans+=1ll*C[tt][k]*C[tot[a[i].x]-tt][k]%mod
59         *(query(a[i+1].y-1)-query(a[i].y)))%=mod;
60     }
61     printf("%d\n",(ans>=0?ans:ans+mod)%mod);
62     return 0;
63 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9598137.html

bzoj1227: [SDOI2009]虔诚的墓主人(树状数组,组合数)相关推荐

  1. BZOJ1227 [SDOI2009]虔诚的墓主人 【树状数组】

    题目 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地.为 ...

  2. HDU4000Fruit Ninja【树状数组+组合数】

    大意: 告诉你一个有n个数的序列 (1 -- n) 问其中有多少组 (a[i], a[j], a[k]) 满足i < j < k 并且 a[i] < a[k] < a[j] 分 ...

  3. P1972 [SDOI2009]HH的项链(离线树状数组)

    整理的算法模板合集: ACM模板 #include<cstdio> #include<algorithm> #include<cstring> #include&l ...

  4. 【树状数组】Bzoj1878[SDOI2009] HH的项链

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...

  5. bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...

  6. 1227: [SDOI2009]虔诚的墓主人

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec  Memory Limit: 259 MB Submit: 1083  Solved: 514 [Submit][St ...

  7. cdoj841-休生伤杜景死惊开 (逆序数变形)【线段树 树状数组】

    http://acm.uestc.edu.cn/#/problem/show/841 休生伤杜景死惊开 Time Limit: 3000/1000MS (Java/Others)     Memory ...

  8. 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

    文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...

  9. [SDOI2009]虔诚的墓主人

    这个题是今天上午模拟赛做的,考场上代码最后时间紧写得巨丑,所以改完以后还是巨丑 80分做法 这是考场上写的,然而数学实在太渣,不知道在模数下不能做除法,组合数部分写ci了 组合数预处理 首先都知道组合 ...

最新文章

  1. Kraken:使用精确比对的超快速宏基因组序列分类软件
  2. 为什么说特斯拉研发自动驾驶AI芯片应该引起注意?
  3. linux字符设备文件的打开操作,Linux字符设备驱动模型之字符设备初始化
  4. Linux centos7防火墙firewalld相关操作
  5. 目标检测系列(五)——Faster R-CNN译文
  6. C 与 JAVA 的对比分析
  7. Dijkstra算法(c++版)
  8. html正方形相册,3D正方体旋转相册.html
  9. 走在WCF学习的路上---印在脑子里的点点滴滴(两种元数据交换方式的优缺点)...
  10. java界面字体大小设置_怎样更改电脑界面的字体大小?
  11. 云安全之虚拟机安全监控
  12. python 的内置方法zip()介绍
  13. linux 下安装 vim
  14. 22. 栈的压入、弹出队列(C++版本)
  15. SVN回滚到指定旧版本操作指南
  16. 微波存在感应雷达,人体存在感应雷达模块,物联网智能赋能应用
  17. Linux系统里压缩PDF文件大小
  18. 为什么要“推销自己”?
  19. 2017.8.18总结3-沙耶的玩偶
  20. 机器学习在学生成绩预测模型上的应用

热门文章

  1. Python之路【第五篇】:面向对象及相关
  2. 【收藏】Java多线程/并发编程大合集
  3. 恍然大悟之原、反、补
  4. 中文版-He Knows My Name(他知道我的名字)-祂认得我-陈熙(音乐河4)
  5. .NET 指南:枚举的设计
  6. php的webservice的wsdl的XML无法显示
  7. 提高IIS网站服务器的效率的八种方法 (转载)
  8. 程序在内存中运行的奥秘
  9. 海思3559A上编译FFmpeg源码操作步骤
  10. 【Qt】Qt再学习(二):Bars Example(Q3DBars)