【BZOJ1227】[SDOI2009]虔诚的墓主人
E. 虔诚的墓主人
题目描述
小W 是一片新造公墓的管理人。公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地。当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地。为了体现自己对主的真诚,他们希望自己的墓地拥有着较高的虔诚度。一块墓地的虔诚度是指以这块墓地为中心的十字架的数目。一个十字架可以看成中间是墓地,墓地的正上、正下、正左、正右都有恰好k 棵常青树。小W 希望知道他所管理的这片公墓中所有墓地的虔诚度总和是多少
输入格式
第一行包含两个用空格分隔的正整数N 和M,表示公墓的宽和长,因此这个矩形公墓共有(N+1) ×(M+1)个格点,左下角的坐标为(0, 0),右上角的坐标为(N, M)。第二行包含一个正整数W,表示公墓中常青树的个数。第三行起共W 行,每行包含两个用空格分隔的非负整数xi和yi,表示一棵常青树的坐标。输入保证没有两棵常青树拥有相同的坐标。最后一行包含一个正整数k,意义如题目所示。
输出格式
包含一个非负整数,表示这片公墓中所有墓地的虔诚度总和。为了方便起见,答案对2,147,483,648 取模。
样例
样例输入
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
样例输出
6
数据范围与提示
图中,以墓地(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棵
树状数组+离散化+组合数
真的是个神仙题,主要是代码打得太乱(逢离散化必挂),颓了测试点才调出来…
M,N远大于W,铁定要离散化,然后W2其实就可以AC了(数据有点水啊),但是是可以被卡掉的,

对于一个墓地,设他的上下左右分别有u[],d[],l[],r[]颗树,则他的虔诚度=C(u,k)*C(d,k)*C(l,k)*C(r,k),
对于同一行两颗常青树a,b之间的空地,他们的l[]和r[]是一样的,所以可以考虑用树状数组维护这一行的每个点C(u,k)*C(d,k)的前缀和,
ans+=C(l[a]+1,k)*C(r[b]+1,k)*(ask(b-1)-ask(a)),换行时单点修改即可。
#include<map>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define mod 2147483648
#define ma(x) memset(x,0,sizeof(x))
using namespace std;
LL N,M,W,k;
LL C[100010][15];
LL xi[100010],yi[100010],tx[100010],ty[100010];
LL h[100010],l[100010];
LL ss[100010],xx[100010];
LL maxx,maxy;
vector<int> inc[100010];
LL Ch[100100];
int lowbit(int x){return x&(-x);}
void add(int x,LL y);
LL ask(int x);
void xget_C(int maxn);
signed main()
{
// freopen("25.in","r",stdin); scanf("%lld%lld%lld",&N,&M,&W);
for(int i=1;i<=W;i++)scanf("%d%d",&xi[i],&yi[i]),tx[i]=xi[i],ty[i]=yi[i];
cin>>k;
xget_C(100000);
sort(xi+1,xi+W+1);
maxx=unique(xi+1,xi+W+1)-xi-1;
sort(yi+1,yi+W+1);
maxy=unique(yi+1,yi+W+1)-yi-1;
for(int i=1;i<=W;i++)
{
int t1=lower_bound(xi+1,xi+maxx+1,tx[i])-xi;
int t2=lower_bound(yi+1,yi+maxy+1,ty[i])-yi;
h[t2]++,l[t1]++;
inc[t2].push_back(t1);
}
for(int i=1;i<=maxy;i++)
sort(inc[i].begin(),inc[i].end());
for(int i=1;i<=maxx;i++)ss[i]=l[i];
LL ans=0;
for(int i=1;i<=maxy;i++)
{
for(int j=0;j<inc[i].size();j++)
{
ss[inc[i][j]]--,xx[inc[i][j]]++;
LL te1=(C[ss[inc[i][j]]][k]*C[xx[inc[i][j]]][k])%mod,
te2=(C[ss[inc[i][j]]+1][k]*C[xx[inc[i][j]]-1][k])%mod;
add(inc[i][j],(te1-te2+mod)%mod);
}
if(i>k && h[i]>=2*k)
for(int j=k;j+k<=inc[i].size();j++)
if(j && inc[i][j]!=inc[i][j-1]+1)
ans=(ans+C[j][k]*C[inc[i].size()-j][k]*(ask(inc[i][j]-1)-ask(inc[i][j-1])))%mod;
}
cout<<(ans%mod+mod)%mod<<endl;
}
void xget_C(int maxn)
{
C[0][0]=1;
for(int i=1;i<=maxn;i++)
{
C[i][0]=1;
for(int j=1;j<=min(i,11);j++)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
}
void add(int x,LL y)
{
while(x<=maxx)
{
Ch[x]=(Ch[x]+y)%mod;
x+=lowbit(x);
}
}
LL ask(int x)
{
LL ans=0;
while(x)
{
ans=(ans+Ch[x])%mod;
x-=lowbit(x);
}
return ans;
}
【BZOJ1227】[SDOI2009]虔诚的墓主人的更多相关文章
- BZOJ1227 SDOI2009 虔诚的墓主人【树状数组+组合数】【好题】*
BZOJ1227 SDOI2009 虔诚的墓主人 Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. ...
- bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 803 Solved: 372[Submit][Statu ...
- [BZOJ1227][SDOI2009]虔诚的墓主人 组合数+树状数组
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 1433 Solved: 672[Submit][Stat ...
- BZOJ1227 [SDOI2009]虔诚的墓主人 【树状数组】
题目 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地.为 ...
- [bzoj1227] [SDOI2009]虔诚的墓主人
终于填上了这个万年巨坑....从初二的时候就听说过这题...然后一直不敢写QAQ 现在感觉也不是很烦(然而我还是写麻烦了 离散化一波,预处理出组合数什么的.. 要维护对于当前行,每列上方和下方节点凑出 ...
- bzoj1227: [SDOI2009]虔诚的墓主人(树状数组,组合数)
传送门 首先,对于每一块墓地,如果上下左右各有$a,b,c,d$棵树,那么总的虔诚度就是$C_k^a*C_k^b*C_k^c*C_k^d$ 那么我们先把所有的点都给离散,然后按$x$为第一关键字,$y ...
- 【BZOJ1227】[SDOI2009]虔诚的墓主人(线段树)
[BZOJ1227][SDOI2009]虔诚的墓主人(线段树) 题面 BZOJ 洛谷 题解 显然发现答案就是对于每一个空位置,考虑上下左右各有多少棵树,然后就是这四个方向上树的数量中选\(K\)棵出来 ...
- bzoj1227 P2154 [SDOI2009]虔诚的墓主人
P2154 [SDOI2009]虔诚的墓主人 组合数学+离散化+树状数组 先看题,结合样例分析,易得每个墓地的虔诚度=C(正左几棵,k)*C(正右几棵,k)*C(正上几棵,k)*C(正下几棵,k),如 ...
- BZOJ 1227: [SDOI2009]虔诚的墓主人
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 1078 Solved: 510[Submit][Stat ...
- Bzoj 1227: [SDOI2009]虔诚的墓主人 树状数组,离散化,组合数学
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 895 Solved: 422[Submit][Statu ...
随机推荐
- 项目中的那些事---Java反射的应用
最近工作中遇到一个这样的问题: 为某个项目中的所有接口做一个测试工具,使用java Swing技术,该项目有不同的版本,不是所有版本中的接口都是相同的,而我做的工具需要兼容所有版本. 于是就引入了这样 ...
- Docker搭建的MySQL容器出现 "Too many connections 1040" 最大连接数修改完未生效的解决方案
原文:Docker搭建的MySQL容器出现 "Too many connections 1040" 最大连接数修改完未生效的解决方案 版权声明:本文为博主原创文章,未经博主允许不得 ...
- python基础--计算机网络
网络编程: 软件开发架构: c/s架构(client/server) c:客户端 s:服务端 b/s架构(browser/server) b:浏览器 s:服务端 服务端:24小时不间断提供服务 客户端 ...
- ucore os 初始化
从bootloader 交出控制权开始 bootloader 最后调用 ((void(*))(void) ()ELF->e_entry& 0xffffff)() ; lab2 虽然e_e ...
- Spring 的初次见面
简介: Spring Framework 是一个开源的企业级应用程序框架,为构建满足企业级需求的应用程序提供了大量的工具集.推出该框架的原因是在时候用J2EE进行开发是会提高复杂性. Spring三大 ...
- SQL Sever实验二 交互式 SQL
一. 实验目的 1.观察查询结果, 体会 SELECT 语句实际应用: 2.要求学生能够使用 SELECT 语句进行数据库查询. 3. 熟练掌握各种查询的操作方法. 二. 实验准备 1. 完成实验一所 ...
- Laravel 批量替换某个字段
Likeword::offset(16854)->chunk(100, function ($word_list) { foreach ($word_list as $word) { $new ...
- The content of element type must match解决方法
当我在mybatis的核心配置文件SqlMapConfig.xml中配置别名的时候,老是提示错误. 把鼠标移到上去就可以看到详细的内容 如下图所示: 问题原因: 通过错误的提示信息,原来这个xml文件 ...
- 将CMD命令提示符的起始位置进行更改 / CMD起始位置发生改变后如何修改回来
具体步骤如下: 1.首先我们需要先找到命令提示符所在的文件目录.可以在开始运行程序中输入CMD,一般回自动搜索匹配. 2.右键点击命令提示符,在弹出菜单中,选择“打开文件位置”: 3.然后我们就可以进 ...
- Http响应response(文件下载、验证码)
Http响应response response:响应 作用: 往浏览器写东西 组成部分: 响应行 响应头 响应体 操作响应行 格式: 协议/版本 状态码 状态码说明 状态码: 1xx:已发送请求 2x ...