Description

小W 是一片新造公墓的管理人。公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地。当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地。为了体现自己对主的真诚,他们希望自己的墓地拥有着较高的虔诚度。一块墓地的虔诚度是指以这块墓地为中心的十字架的数目。一个十字架可以看成中间是墓地,墓地的正上、正下、正左、正右都有恰好k 棵常青树。小W 希望知道他所管理的这片公墓中所有墓地的虔诚度总和是多少

Input

第一行包含两个用空格分隔的正整数N 和M,表示公墓的宽和长,因此这个矩形公墓共有(N+1) ×(M+1)个格点,左下角的坐标为(0, 0),右上角的坐标为(N, M)。第二行包含一个正整数W,表示公墓中常青树的个数。第三行起共W 行,每行包含两个用空格分隔的非负整数xi和yi,表示一棵常青树的坐标。输入保证没有两棵常青树拥有相同的坐标。最后一行包含一个正整数k,意义如题目所示。

Output

包含一个非负整数,表示这片公墓中所有墓地的虔诚度总和。为了方便起见,答案对2,147,483,648 取模。

Sample Input

5 6
13
0 2
0 3
1 2
1 3
2 0
2 1
2 4
2 5
2 6
3 2
3 3
4 3
5 2
2

Sample Output

6

HINT

图中,以墓地(2, 2)和(2, 3)为中心的十字架各有3个,即它们的虔诚度均为3。其他墓地的虔诚度为0。

所有数据满足1 ≤ N, M ≤ 1,000,000,000,0 ≤ xi ≤ N,0 ≤ yi ≤ M,1 ≤ W ≤ 100,000, 1 ≤ k ≤ 10。存在50%的数据,满足1 ≤ k ≤ 2。存在25%的数据,满足1 ≤ W ≤ 10000。

注意:”恰好有k颗树“,这里的恰好不是有且只有,而是从>=k的树中恰好选k棵

/*首先将横纵坐标离散化。我们可以发现,对于一个墓地,它对答案的贡献是C(l,k)*C(r,k)*C(u,k)*C(d,k),如果统计每个墓地的话,是O(n*m)的。我们考虑能否将两棵树之间的一大坨墓地的贡献一块求出来,即C(l,k)*C(r,k)*∑C(u[i],k)*C(d[i],k),然后用树状数组优化。
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 100010
#define mod 2147483647
using namespace std;
struct node{int x,y,tx,l,r,u,d;//tx是离散化之后的x坐标bool is;//与同一行的下一个点是否存在空隙
};node a[N];
int c[N][15],dis[N],tree[N],hash[N],last[N],n,m,w,K;
bool cmp(node a,node b){if(a.y==b.y) return a.x<b.x;return a.y<b.y;
}
void init(){for(int i=0;i<N;i++){c[i][0]=1;for(int j=1;j<=min(i,10);j++)c[i][j]=c[i-1][j-1]+c[i-1][j];}
}
int lowbit(int x){return x&(-x);
}
void add(int x,int val){while(x<N){tree[x]+=val;x+=lowbit(x);}
}
int query(int x){int ret=0;while(x){ret+=tree[x];x-=lowbit(x);}return ret;
}
int main(){init();scanf("%d%d%d",&n,&m,&w);for(int i=1;i<=w;i++){scanf("%d%d",&a[i].x,&a[i].y);dis[i]=a[i].x;}scanf("%d",&K);sort(dis+1,dis+w+1);int len=unique(dis+1,dis+w+1)-dis-1;sort(a+1,a+w+1,cmp);//y坐标排序for(int i=1,y=-1,k=0;i<=w;i++){if(a[i].y!=y) y=a[i].y,k=0;//新的一行a[i].l=k;k++;a[i].tx=lower_bound(dis+1,dis+len+1,a[i].x)-dis;a[i].d=hash[a[i].tx];hash[a[i].tx]++;//hash表示a[i].tx这一列已经累计了多少点了if(a[last[a[i].tx]].y+1==a[i].y)a[last[a[i].tx]].is=1;last[a[i].tx]=i;}for(int i=w,y=-1,k=0;i;i--){if(a[i].y!=y) y=a[i].y,k=0;a[i].r=k;k++;a[i].u=hash[a[i].tx]-a[i].d-1;}int ans=0;for(int i=1;i<=w;i++){if(!a[i].is)//a[i].tx与a[i+1].tx之间存在空隙add(a[i].tx,c[a[i].u][K]*c[a[i].d+1][K]-(query(a[i].tx)-query(a[i].tx-1)));//清空原来的值,并加上新的值 if(a[i].y==a[i+1].y)ans+=c[a[i].l+1][K]*c[a[i+1].r+1][K]*(query(a[i+1].tx-1)-query(a[i].tx));//累加两点间的值
    }printf("%d",ans&mod);return 0;
}

转载于:https://www.cnblogs.com/harden/p/6288030.html

虔诚的墓主人(bzoj 1227)相关推荐

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

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

  2. bzoj 1227 [SDOI2009]虔诚的墓主人

    疯狂re 换了一种写法才过... 思路:将x轴离散化,处理出来每个点上下左右一个有多少个点, 对于同一行的两个点来说,他们之间的 这些空的点都是可以一起算的,我们用树状数组按y轴从小到大维护 每一列的 ...

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

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

  4. 【SDOI2009】【BZOJ1227】虔诚的墓主人

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

  5. bzoj1227: [SDOI2009]虔诚的墓主人(树状数组,组合数)

    传送门 首先,对于每一块墓地,如果上下左右各有$a,b,c,d$棵树,那么总的虔诚度就是$C_k^a*C_k^b*C_k^c*C_k^d$ 那么我们先把所有的点都给离散,然后按$x$为第一关键字,$y ...

  6. 2017.9.24 虔诚的墓主人 思考记录

    这个题是纯信息处理题. 首先要明白,对墓地进行枚举是会T的,需要对常青树进行枚举 所以枚举的顺序也要注意:一定要按某种顺序 然后要明白,每一个常青树会对列和行都造成影响,对答案有贡献的点只会在两个点之 ...

  7. [SDOI2009]虔诚的墓主人

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

  8. bzoj-1227 虔诚的墓主人

    题意: 在一个nxm的矩形里给出一些w个点,这些是常青树的坐标: 求所有空地上下左右能组成的长度为k的十字架的总数: 1<=n,m<=10^9,1<=w<=100000,1&l ...

  9. linux单机到单机adg环境,Oracle 11.2.0.4 DataGuard 环境打PSU,OJVM PSU补丁快速参考

    环境:RHEL6.5 + Oracle 11.2.0.4 DataGuard physical standby 主库和备库都是单节点. 需求:主备库同时应用160719的PSU和OJVM PSU补丁. ...

最新文章

  1. 深入FFM原理与实践
  2. 开平推进智慧城市等领域信息化建设及公共数据资源共享
  3. cad考试题库绘图题答案_证券从业资格考试证券市场基本法律法规题库答案
  4. cocos2d-x3.2创建项目
  5. 易流即时配送_即时大数据流处理=即时风暴
  6. Scala函数式对象-有理数
  7. 记得重用layout
  8. linux df和du常用命令
  9. 【时间序列预测】基于matlab CNN优化LSTM时间序列预测(单变量单输出)【含Matlab源码 1688期】
  10. 永磁同步电机的矢量控制策略(十二)一一一MTPA最大转矩电流比控制
  11. 求两个数最大公因数(直接求、辗转相除法)、最小公倍数
  12. 网络原创文章版权维护的辅助好工具copycheck抄袭检测软件
  13. 微信之分享到朋友圈并记录分享次数
  14. pyinstaller说明(windows、mac、linux)
  15. 记录几个免费质量高的图库视频库
  16. 数据结构之链表(Studing Play with DataStruct)
  17. linux系统与window区别,linux系统和windows系统的区别是什么?
  18. Android_listview_video安卓列表视频直接播放
  19. DataGrip连接hive建表时报cannot recognize input near ‘show‘ ‘indexes‘ ‘on‘ in ddl statement错误
  20. SLUB DEBUG原理

热门文章

  1. End-to-end Recovery of Human Shape and Pose
  2. sql not exists用法_牛客网数据库SQL实战详细剖析(5160)(更新完结)
  3. python str转int_Python入门丨数据类型与转换
  4. http请求头获取 -python
  5. python大众点评最新字体加密破解完结
  6. django xadmin 默认密码_Pycharm创建Django项目讲解 python django
  7. 巧用Android网络通信技术,在网络上直接传输对象
  8. C++: 对字符串转换字符集(编码)
  9. 职称考试计算机怎么学容易,计算机职称考试备考的六个关键点
  10. if和else同时执行_为什么大量的if else这么不受待见?怎么“干掉”它?