1227: [SDOI2009]虔诚的墓主人

Time Limit: 5 Sec  Memory Limit: 259 MB
Submit: 1412  Solved: 664
[Submit][Status][Discuss]

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棵

首先要离散坐标    由于如果一个点正上下左右都没有其他点,那么他是肯定不会贡献答案的,所以只用记录所有点的横纵坐标,重新构成坐标系统计答案

l[]表示它同行左边的点个个数,r[]表示右边,u[]表示同列上面的点的个数,d表示同列下面的点数 c[]表示组合数

对于纵坐标相同且横坐标相邻的两点设为a,b,那么他们中间的一段无点的区间可以贡献的答案就是c[l[a]][k]*c[r[b]][k]*sigma(c[u[i]][k]*c[d[i]][k])  (a<i<b)

对于中间那一段,可以用bit动态统计。bit下标为横坐标,表示在当前列横坐标为x选择的方案数,用num统计当前列横坐标为x正下方的点数方便转移

当新扫描到一个点,这个点就会对bit进行影响,num[x]++,此位置的方案数也会变化

具体要看代码实现

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define inf 0x3f3f3f3f
#define ll long long
#define N 1000050
#define mod 2147483648LL
using namespace std;
int n,m,w,k,num[N<<1],h[N<<1],l[N<<1],b[N<<1];
ll v[N<<1],c[N][12];
void update(int x,int val){
while(x<=2*w){
v[x]+=val;v[x]%=mod;
x+=x&-x;
}
}
ll query(int x){
ll res=0;
while(x){
res+=v[x];res%=mod;
x-=x&-x;
}
return res;
}
struct tree{
int x,y;
bool operator < (const tree &b)const{
return y==b.y?x<b.x:y<b.y;
}
}a[N];
void pre(){
for(int i=0;i<=w;i++)c[i][0]=c[i][i]=1;
for(int i=1;i<=w;i++)
for(int j=1;j<=min(i,k);j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
int main(){
scanf("%d%d%d",&n,&m,&w);
for(int i=1;i<=w;i++){
scanf("%d%d",&a[i].x,&a[i].y);
b[i]=a[i].x;b[i+w]=a[i].y;
}scanf("%d",&k);pre(); sort(b+1,b+1+w*2);sort(a+1,a+1+w);
int len=unique(b+1,b+1+w*2)-b-1;
for(int i=1;i<=w;i++){
int px=lower_bound(b+1,b+len+1,a[i].x)-b;
int py=lower_bound(b+1,b+len+1,a[i].y)-b;
h[py]++;l[px]++;
}
int cnt=0;ll ans=0;
for(int i=1;i<=w;i++){
int px=lower_bound(b+1,b+len+1,a[i].x)-b;
int py=lower_bound(b+1,b+len+1,a[i].y)-b;
int pre=lower_bound(b+1,b+len+1,a[i-1].x)-b;
if(i>1&&a[i].y==a[i-1].y){
cnt++;
ll t1=c[cnt][k]*c[h[py]-cnt][k];
ll t2=query(px-1)-query(pre);
ans+=t1*t2;ans%=mod;
}
else cnt=0;
num[px]++;int t=num[px];
int change=(c[t][k]*c[l[px]-t][k]-c[t-1][k]*c[l[px]-t+1][k])%mod;
update(px,change);
//printf("%lld %lld\n",change,ans);
}
if(ans<0)ans+=mod;cout<<ans;
return 0;
}

bzoj1227 组合数学+bit的更多相关文章

  1. BZOJ-1227 虔诚的墓主人 树状数组+离散化+组合数学

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MB Submit: 914 Solved: 431 [Submit][Statu ...

  2. 【bzoj1227】 SDOI2009—虔诚的墓主人

    http://www.lydsy.com/JudgeOnline/problem.php?id=1227 (题目链接) 题意 一个n*m的公墓,一个点上要么是墓地,要么是常青树,给出一个数K,并规定每 ...

  3. poj 3734 Blocks 快速幂+费马小定理+组合数学

    题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...

  4. 组合数学or not ---- n选k有重

    模板问题: 1. 取物品 (comb.pas/c/cpp) [问题描述] 现在有n个物品(有可能相同),请您编程计算从中取k个有多少种不同的取法.[输入] 输入文件有两行,第一行包含两个整数n,k(2 ...

  5. 组合数学(全排列)+DFS CSU 1563 Lexicography

    题目传送门 /* 题意:求第K个全排列 组合数学:首先,使用next_permutation 函数会超时,思路应该转变, 摘抄网上的解法如下: 假设第一位是a,不论a是什么数,axxxxxxxx一共有 ...

  6. uestc1888 Birthday Party    组合数学,乘法原理

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=25539#problem/G 题目意思: 有n个人,每个人有一个礼物,每个人能拿 ...

  7. UVA 11076 Add Again 计算对答案的贡献+组合数学

    A pair of numbers has a unique LCM but a single number can be the LCM of more than one possiblepairs ...

  8. POJ3252——Round Number(组合数学)

    Round Numbers DescriptionThe cows, as you know, have no fingers or thumbs and thus are unable to pla ...

  9. HDU4675【GCD of scequence】【组合数学、费马小定理、取模】

    看题解一开始还有地方不理解,果然是我的组合数学思维比较差 然后理解了之后自己敲了一个果断TLE.... 我以后果然还得多练啊 好巧妙的思路啊 知识1: 对于除法取模还需要用到费马小定理: a ^ (p ...

随机推荐

  1. 视频聊天 Demo

    ESFramework Demo -- 入门Demo,简单的即时通讯系统(附源码) 是基于ESFramework实现的一个简单的文字聊天demo,现在,我们将在这个demo的基础上,使用OMCS为其增 ...

  2. datetimepicker.js 使用笔记

    1.官网地址 官网传送门 2.属性及使用示例 2.1调用 html: <input  type="text"  readonly class="date" ...

  3. SSM框架中前端页面(AJAX+Jquery+spring mvc+bootstrap)

    前端新增页面的模态框,采用bootstarp建立.定义了empName,email,gender,depatName,四个属性的ID:其中保存按钮的ID:emp_save_btn,对应的点击函数如下: ...

  4. redis入门(14)redis集群下的数据分区存储

    redis入门(10)redis集群下的数据分区存储

  5. VMware虚拟机安装

            学习Linux系统最好的方式就是在自己的虚拟机上安装Linux:接下来就给大家简单介绍一下VMware虚拟机的安装以及Linux的安装:VMware虚拟机只是为了更好的学习Linux: ...

  6. Android fragment切换后onresume时报 Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim'

    动态加载fragment以后,调用了remove方法移除Fragment,在返回来的时候报 Attempt to write to field 'int android.support.v4.app. ...

  7. SendMessage 遇到的神坑

    场景 两个进程A和B,需要从A中设置B中的文本框的内容 过程 x.x.x.x. 成功获取了B中的内容,惊喜,离成功更近异步 xxxx ***** ....... x.x.x.x. 大约查找了几百个网页 ...

  8. Python/MySQL(三、pymysql使用)

    Python/MySQL(三.pymysql使用) 所谓pymysql就是通过pycharm导入pymysql模块进行远程连接mysql服务端进行数据管理操作. 一.在pycharm中导入pymysq ...

  9. linux添加超级用户

    创建super账号 useradd testuser 创建用户testuser passwd testuser 给已创建的用户testuser设置密码 如果需要让此用户有root权限,执行命令: ro ...

  10. python的切片操作

    切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割.注意这与你使用的索引操作符十分相似.记住数是可选的,而冒号是必须的. 切片操作符中的第一个数(冒号之前)表示切片开始的位置,第 ...