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. v7000数据恢复_MDisk重建数据恢复方法(北亚数据恢复)

    很多工程师都有这样的疑问,MDisk重建后还能不能恢复数据呢?应该怎么做才能恢复数据呢?本文这里就以IBM V7000存储为例,详细讲解因为某个MDisk被重建导致的数据丢失的恢复方法.我们本案例中的 ...

  2. New UWP Community Toolkit - AdaptiveGridView

    概述 UWP Community Toolkit  中有一个自适应的 GridView 控件 - AdaptiveGridView,本篇我们结合代码详细讲解  AdaptiveGridView 的实现 ...

  3. kali rolling更新源之gpg和dirmngr问题

    1.编辑 /etc/apt/source.list gedit /etc/apt/sources.list 输入更新源,可以选任何可用更新源,这里设置官方源 deb http://http.kali. ...

  4. 外网访问本地服务器下的web应用

    让本地服务器可以在外网访问的方式有很多,介绍其中一种: 由于本人是在自己电脑上装了一个虚拟机, 测试环境为:虚拟机作为服务器,服务器中装了一个禅道,虚拟机IP192.168.2.221,本人通过tpl ...

  5. node防xss攻击插件

    var xss = require('node-xss').clean; router.post("/orders/insert-orders", function (req, r ...

  6. 使用location.href跳转页面在火狐浏览器中报错404

    HTML文件中引入外部js文件,在该js文件里用window.location.href跳转相对路径下的html地址,火狐浏览器会报错404,而谷歌浏览器却显示正常·,分析了一下原因:在识别相对路径时 ...

  7. angular4学习笔记整理(二)angular4的路由使用

    这章说一下angular的路由 先说angular路由怎么引入,一开始new出来的angular项目它路由帮你配好了,但看要看app.module.ts里面 1.首先最上面要引入路由模块 import ...

  8. Mego开发文档 - 数据属性生成值

    数据属性生成值 该功能用于在数据插入或更新时为指定属性生成期望的值,Mego提供了非常灵活的实现方式以满足各种数据提交时的自动赋值问题. 生成值目的及模式 在Mego中生成值的目的一定是插入数据或更新 ...

  9. javascript学习(4)异常处理 try-catch 和 onerror

    一.try-catch 1.样例1 1.1.源代码 1.2.执行后 2.样例2 2.1.源代码 2.2.执行后 二.onerror 1.源代码 2.执行后

  10. 阿里云API网关(7)开发指南-API参考

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...