Luogu 2154 [SDOI2009]虔诚的墓主人
弄了很久,状态很烂……
首先发现可用的点一共只有$1e5$个,所以可以离散化坐标来方便计算。
发现对于一个空格,设它的上、下、左、右分别有$u, d, l, r$个点,它产生的贡献是$\binom{u}{k} * \binom{d}{k} * \binom{l}{k} * \binom{r}{k}$,这样子一共要计算$n^{2}$个点,时间承受不了,考虑使用扫描线优化。
我们可以扫$x$坐标或$y$坐标,这样子在扫一条线的过程中可以把上面的式子提出来两项,然后剩下的两项我们考虑用一个数据结构优化计算。
假设我们扫$y$坐标,那么我们可以用一个树状数组维护前后两个$y$坐标中间的$x$坐标产生的贡献,即$\sum \binom{cnt}{k} * \binom{sum - cnt}{k}$。
这样子每扫一个点可以动态维护一下,把它之前的贡献清空,加上之后产生的贡献,即$s_{x} += \sum \binom{cnt + 1}{k} * \binom{sum - cnt - 1}{k} - \sum \binom{cnt}{k} * \binom{sum - cnt}{k}$。
另外不是很懂这题的取模,多取了几个之后发现爆负数了,抄了hzwer的代码。
注意把$x$和$y$一起离散化。
时间复杂度$O(nlogn)$。
Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll; const int N = 1e5 + ;
const ll P = 2147483648LL; int n, m, w, K, tot = , in[N << ], cnt[N];
ll c[N][], sumx[N], sumy[N]; struct Node {
int x, y;
} a[N]; bool cmp(const Node &u, const Node &v) {
if(u.y == v.y) return u.x < v.x;
else return u.y < v.y;
} inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} namespace BinaryIndexTree {
ll s[N << ]; #define lowbit(p) (p & (-p)) inline void modify(int p, ll v) {
for(; p <= tot; p += lowbit(p))
s[p] += v, s[p] %= P;
} inline ll query(int p) {
ll res = 0LL;
for(; p > ; p -= lowbit(p))
res += s[p], res %= P;
return res;
} } using namespace BinaryIndexTree; int main() {
read(n), read(m), read(w);
for(int i = ; i <= w; i++) {
read(a[i].x), read(a[i].y);
in[++tot] = a[i].x, in[++tot] = a[i].y;
}
read(K); c[][] = 1LL;
for(int i = ; i <= w; i++) {
c[i][] = 1LL;
for(int j = ; j <= min(i, K); j++)
c[i][j] = (c[i - ][j - ] + c[i - ][j]) % P;
} sort(in + , in + + tot);
tot = unique(in + , in + + tot) - in - ;
for(int i = ; i <= w; i++) {
a[i].x = lower_bound(in + , in + tot + , a[i].x) - in;
a[i].y = lower_bound(in + , in + tot + , a[i].y) - in;
sumx[a[i].x]++, sumy[a[i].y]++;
} /* for(int i = 1; i <= w; i++)
printf("%d %d\n", a[i].x, a[i].y); */ sort(a + , a + + w, cmp);
ll ans = 0LL; int cnty;
for(int i = ; i <= w; i++) {
if(i > && a[i].y == a[i - ].y) {
++cnty;
ll tmp1 = query(a[i].x - ) - query(a[i - ].x);
ll tmp2 = c[cnty][K] * c[sumy[a[i].y] - cnty][K];
ans += tmp1 * tmp2; ans %= P;
} else cnty = ;
cnt[a[i].x]++;
modify(a[i].x, (c[cnt[a[i].x]][K] * c[sumx[a[i].x] - cnt[a[i].x]][K]
- c[cnt[a[i].x] - ][K] * c[sumx[a[i].x] - cnt[a[i].x] + ][K]) % P);
} if(ans < ) ans += P;
printf("%lld\n", ans);
return ;
}
Luogu 2154 [SDOI2009]虔诚的墓主人的更多相关文章
- luogu P2154 [SDOI2009]虔诚的墓主人
luogu 下面记一个点上下左右点数分别为\(u_i,d_i,l_i,r_i\) 枚举每个中间点太慢了,考虑枚举两个点之间横的一条线段,这里面的点左边点数目都相同,右边点数目都相同,然后只要查一下区间 ...
- BZOJ1227或洛谷2154 [SDOI2009]虔诚的墓主人
BZOJ原题链接 洛谷原题链接 又是扫描线,题解可看大佬的博客(太懒了不想打) #include<cstdio> #include<algorithm> using names ...
- 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 ...
- bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 803 Solved: 372[Submit][Statu ...
- 1227: [SDOI2009]虔诚的墓主人
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 1083 Solved: 514[Submit][Stat ...
- bzoj1227 P2154 [SDOI2009]虔诚的墓主人
P2154 [SDOI2009]虔诚的墓主人 组合数学+离散化+树状数组 先看题,结合样例分析,易得每个墓地的虔诚度=C(正左几棵,k)*C(正右几棵,k)*C(正上几棵,k)*C(正下几棵,k),如 ...
- 【BZOJ1227】[SDOI2009]虔诚的墓主人(线段树)
[BZOJ1227][SDOI2009]虔诚的墓主人(线段树) 题面 BZOJ 洛谷 题解 显然发现答案就是对于每一个空位置,考虑上下左右各有多少棵树,然后就是这四个方向上树的数量中选\(K\)棵出来 ...
- BZOJ1227 SDOI2009 虔诚的墓主人【树状数组+组合数】【好题】*
BZOJ1227 SDOI2009 虔诚的墓主人 Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. ...
随机推荐
- SDOI 2017 天才黑客
/* 根据claris的 博客以及 beginend 的博客来写的 首先考虑如何求出最短路 可以从样例看出 路径是从边走到边的, 所以我们将边看作点 有共同端点的两边之间 互相连边, 边权为lcp. ...
- 35. CentOS-6.3安装拼音输入法
安装方法: su root yum install "@Chinese Support" // 安装中文输入法 exit 装好后,在“系统-->首选项”就会看到有“ ...
- docker学习笔记 参考
https://www.cnblogs.com/YDDMAX/p/6045079.html 参考此人播客:docker 分类 http://www.cnblogs.com/51kata/categor ...
- leetcode242
public class Solution { public bool IsAnagram(string s, string t) { Dictionary<char, int> dic ...
- 单网卡用双IP上内外网
网络 2008-09-22 17:42 阅读44 评论1 字号: 大 中 小 PC机同时上内外网一例 一个公司内部,一台pc机在上内网的同时,还要求上外网,如何在一块网卡上实现 ...
- ready 事件 DOM(文档对象模型) 已经加载....
定义和用法 当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件. 由于该事件在文档就绪后发生,因此把所有其他的 jQuery 事件和函数置于该事件中是非 ...
- keepalive配置与管理
什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用 ...
- PHP - pcntl_fork() 执行过程详解
<?php $pid = pcntl_fork();if ($pid == -1){ die("could not fork");}elseif($pid == 0 ...
- sar命令详细信息
sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用情 ...
- mysql datetime与timestamp精确到毫秒的问题
CREATE TABLE `tab1` (`tab1_id` VARCHAR(11) DEFAULT NULL,`create` TIMESTAMP(3) NULL DEFAULT NULL,`cre ...