「题解报告」P2154 虔诚的墓主人
P2154 虔诚的墓主人 题解
题意
在 \(n\times m\) 一个方格上给你 \(w\) 个点,求方格里每个点正上下左右各选 \(k\) 个点的方案数。
\(1 \le N, M \le 1,000,000,000,0 \le x_i \le N,0 \le y_i \le M,1 \le W \le 100,000,1 \le k \le 10\)。
思路
首先看到 \(N,M\) 这么大,肯定要先离散化一下。
然后考虑怎么求方案数。
我们先对离散化后的点排个序,然后考虑两个 \(x\) 相同的点 \(x,y1\) 和 \(x,y2\) 之间的所有点的方案数。
显然是:
\]
你们意会一下。
观察这个式子,\(C_{y1\_UP}^{k}\times C_{y2\_DOWN}^{k}\) 当前已知,可以用前缀和维护 \(\sum C_{l\_LEFT}^{k}\times C_{l\_RIGHT}^{k}\)。
那么我们就开一个树状数组,维护前 \(i\) 行的 \(C_{l\_LEFT}^{k}\times C_{l\_RIGHT}^{k}\) 之和,每次碰到一个点 \(x,yy\) 时把当前行的影响清除,再令 \(yy\_LEFT+1,yy\_RIGHT-1\),再重新计入前缀和。
可以参考代码中 Solve 函数中变量 \(u\) 的求法。
时间复杂度 \(O(nlogn)\)。
我这个菜鸡居然因为取模取错了调了两节课。
Code
#include <bits/stdc++.h>
#define _for(i,a,b) for(ll i=a;i<=b;++i)
#define for_(i,a,b) for(ll i=a;i>=b;--i)
#define ll long long
using namespace std;
const ll N=1e5+10,P=2147483648;
ll n,m,w,k,q[N],h[N],z[N],y[N],ans;
struct tree{ll x,y;}t[N];
inline ll rnt(){
ll x=0,w=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*w;
}
namespace SZSZ{
/*树状数组*/
ll b[N];
inline ll lowbit(ll x){return x&-x;}
inline void UpDate(ll x,ll y){
while(x<=w){
b[x]=(b[x]+y)%P;
x+=lowbit(x);
}
return;
}
inline ll Query(ll x){
if(x==0)return 0;
ll sum=0;
while(x){
sum=(sum+b[x])%P;
x-=lowbit(x);
}
return sum;
}
}
namespace LISAN{
/*离散化*/
vector<ll>xx,yy;
inline bool cmp(tree a,tree b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
inline void Add(ll x,ll y){
xx.push_back(x);
yy.push_back(y);
return;
}
inline void LiSan(){
sort(xx.begin(),xx.end());
sort(yy.begin(),yy.end());
xx.erase(unique(xx.begin(),xx.end()),xx.end());
yy.erase(unique(yy.begin(),yy.end()),yy.end());
_for(i,1,w){
t[i].x=lower_bound(xx.begin(),xx.end(),t[i].x)-xx.begin()+1;
t[i].y=lower_bound(yy.begin(),yy.end(),t[i].y)-yy.begin()+1;
++h[t[i].x],++y[t[i].y];
}
sort(t+1,t+w+1,cmp);
return;
}
}
namespace SOLVE{
ll c[N*20][20]={0};
/*预处理组合数*/
inline void PreC(){
c[0][0]=1;
_for(i,1,w){
c[i][0]=1;
_for(j,1,min(k,i))
c[i][j]=(c[i-1][j]+c[i-1][j-1])%P;
}
}
/*求解*/
inline ll Solve(){
PreC();
_for(i,1,w-1){
++q[t[i].x];
++z[t[i].y];
if(t[i].x==t[i+1].x&&q[t[i].x]>=k&&h[t[i].x]-q[t[i].x]>=k){
ll up=c[q[t[i].x]][k];
ll dn=c[h[t[i].x]-q[t[i].x]][k];
ll ri=SZSZ::Query(t[i+1].y-1)-SZSZ::Query(t[i].y);
ans+=((up*dn+P)%P*ri+P)%P;
ans%=P;
}
ll u=((c[z[t[i].y]][k]*c[y[t[i].y]-z[t[i].y]][k]+P)%P-(SZSZ::Query(t[i].y)-SZSZ::Query(t[i].y-1)+P)%P+P)%P;
SZSZ::UpDate(t[i].y,u);
}
return ans;
}
}
int main(){
n=rnt(),m=rnt(),w=rnt();
_for(i,1,w){
t[i].x=rnt(),t[i].y=rnt();
LISAN::Add(t[i].x,t[i].y);
}
k=rnt();
LISAN::LiSan();
printf("%lld\n",SOLVE::Solve());
return 0;
}
/*
*/
「题解报告」P2154 虔诚的墓主人的更多相关文章
- 「题解报告」 P3167 [CQOI2014]通配符匹配
「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...
- 「题解报告」P4577 [FJOI2018]领导集团问题
题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...
- 「题解报告」SP16185 Mining your own business
题解 SP16185 Mining your own business 原题传送门 题意 给你一个无向图,求至少安装多少个太平井,才能使不管那个点封闭,其他点都可以与有太平井的点联通. 题解 其他题解 ...
- 「题解报告」Blocks
P3503 Blocks 题解 原题传送门 思路 首先我们可以发现,若 \(a_l\) ~ \(a_r\) 的平均值大于等于 \(k\) ,则这个区间一定可以转化为都大于等于 \(k\) 的.我们就把 ...
- 「题解报告」P3354
P3354 题解 题目传送门 一道很恶心的树形dp 但是我喜欢 题目大意: 一片海旁边有一条树状的河,入海口有一个大伐木场,每条河的分叉处都有村庄.建了伐木场的村庄可以直接处理木料,否则要往下游的伐木 ...
- 「题解报告」CF1067A Array Without Local Maximums
大佬们的题解都太深奥了,直接把转移方程放出来让其他大佬们感性理解,蒟蒻们很难理解,所以我就写了一篇让像我一样的蒟蒻能看懂的题解 原题传送门 动态规划三部曲:确定状态,转移方程,初始状态和答案. --神 ...
- 「题解报告」P7301 【[USACO21JAN] Spaced Out S】
原题传送门 神奇的5分算法:直接输出样例. 20分算法 直接把每个点是否有牛的状态DFS一遍同时判断是否合法,时间复杂度约为\(O(2^{n^2})\)(因为有判断合法的剪枝所以会比这个低).而在前四 ...
- 【Luogu】P2154虔诚的墓主人(树状数组)
题目链接 这题就是考虑我们有这样一个情况
- bzoj1227 P2154 [SDOI2009]虔诚的墓主人
P2154 [SDOI2009]虔诚的墓主人 组合数学+离散化+树状数组 先看题,结合样例分析,易得每个墓地的虔诚度=C(正左几棵,k)*C(正右几棵,k)*C(正上几棵,k)*C(正下几棵,k),如 ...
随机推荐
- 入坑KeePass(四)KeePass通过坚果云WebDav同步方法
参考博客:什么值得买平台-Keepass+坚果云:多平台密码无缝同步 .1.在坚果云上创建一个同步专用的文件夹(建议勾上"默认不同步到电脑"选项) 创建之后可以把刚才创建的数据库文 ...
- buuctf刷题记录
极客大挑战 2019]EasySQL-1 直接通过输入万能密码:' or 1=1#实现注入: 思考:服务端sql语句应该为:select * from users where username='xx ...
- php为图片添加水印
<?php /** * 图片加水印(适用于png/jpg/gif格式) * * @author flynetcn * * @param $srcImg 原图片 * @param $waterIm ...
- golang的defer踩坑汇总
原文链接:http://www.zhoubotong.site/post/50.html defer语句用于延迟函数调用,每次会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行.延迟函数可以有参 ...
- element ui 自定义主题失败(primordials is not defined)
卸载: 1.卸载cnpm npm uninstall cnpm -g 2.卸载vue-cli npm uninstall @vue/cli -g 3.卸载nodejs和删除文件 C:\Program ...
- docker删除镜像报错 Error response from daemon: conflict: unable to delete f73fe6298efc (cannot be forced) - image has dependent child images
方法1 docker rmi 镜像ID 方法2 docker rmi -f 镜像ID 方法3 docker rmi 镜像仓库名:tag
- 本地拉取服务器上的项目,SVN 由于目标计算机积极拒绝 无法连接失败
下面几种解决方案一定一定一定都要试一下哈, 比如,如果你的SVN没有启动,并且防火墙也开启了,那么你即便启动了SVN,也是无法拉取项目的,需要把防火墙也关闭. 1.是否启动了svn 输入命令查看是否启 ...
- HDFS数据平衡
一.datanode之间的数据平衡 1.1.介绍 Hadoop 分布式文件系统(Hadoop Distributed FilSystem),简称 HDFS,被设计成适合运行在通用硬件上的分布式文件 ...
- 蒸腾量与蒸散量(ET)数据、潜在蒸散量、实际蒸散量数据、气温数据、降雨量数据
数据下载链接:数据下载链接 引言 多种卫星遥感数据反演地表蒸腾与蒸散率(ET)产品是地理遥感生态网推出的生态环境类数据产品之一,产品包括2000-2009年三个波段RGB数据,值域0-252之 ...
- 编写可维护的webpack配置
为什么要构建配置抽离成npm包 通用性 业务开发者无需挂住配置 统一团队构建脚本 可维护性 构建配置合理的拆分 README文档, chan 构建配置管理的可选方案 通过多个配置管理不同环境的构建, ...