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. 使用Github pages+jekyll搭建自己的博客(windows版)

    最近突发奇想,想试试GitHub pages来搭建博客.网上一搜一大堆,嗯...看来还是挺简单的...于是自己撸起袖子干...... 结果对于我这种GitHub注册过,git 没用过,ruby.jek ...

  2. vue项目结构

    前言 我在 搭建vue项目环境 简单说明了项目初始化完成后的目录结构. 但在实际项目中,src目录下的结构需要跟随项目做一些小小的调整. 目录结构 ├── src 项目源码目录 │ ├── api 所 ...

  3. Oracle银行存取钱系统

    Oracle银行存取钱系统 /* 银行系统 要求: 1.创建一个用户信息表(userinfo).一个交易信息表(deal) 2.用户信息表字段:用户编号.用户名称.密码.余额 交易信息表字段:编号.交 ...

  4. 新概念英语(1-3)Sorry, sir

    Does the man get his umbrella back? A:My coat and my umbrella please. B:Here is my ticket. A:Thank y ...

  5. iOS 封装.framework 以及使用

    .framework是什么? .framework是什么? 这个问题相信做iOS的都知道答案. 在我们的日常开发中,经常会用到各种已经封装好的库,比如支付宝.微信SDK等等中的库,这些库可以给我们的开 ...

  6. mybatis的generator中xml配置问题

    <!-- 生成模型的包名和位置 --> <javaModelGenerator targetPackage="com.sung.risk.model.biz" t ...

  7. python/socket编程之粘包

    python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...

  8. Python系列 - 进程和线程

    进程和线程 可以通过ucos-Ⅱ来学习相关的基础,很好的学习资料 进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作), 而此时CPU只能静静地等待任务A读取完 ...

  9. IDLE常用快捷键汇总(转)

    IDLE(An Integrated DeveLopment Environment for Python)是Python自带的编译器,在初学者,或写小程序,或用于验证的时候,经常用到!如果能熟练掌握 ...

  10. 【FAQ系列】关于SQL_Errno:1677导致主从复制中断的思考和实践

    1.简单介绍该错误发生的背景: 1) 数据库版本:MySQL5.7.19 2) 对一个大表修改字段类型DDL(将主键id int变为bigint),为了不影响主库业务,先在从库上执行DDL操作,然后通 ...