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 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. ...
随机推荐
- node使用MySQL数据库
内容: 1.node连接数据库 2.数据库常用操作 3.数据库实例 - 用户注册.登陆 1.node连接数据库 (1)下载mysql模块 (2)使用mysql模块连接数据库 let db=mysql. ...
- collections模块---(namedtuple、deque、OrderdDict、defaultdict、Counter)和configparser模块
在内置数据类型(dict. list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter. deque.defaultdict.namedtuple 和 ...
- selenium+python自动化96-执行jquery报:$ is not defined
前言 背景介绍:做wap页面自动化的时候,把url地址直接输入到浏览器(chrome浏览器有手机wap模式)上测试,有个按钮死活点不到,用wap模式的触摸事件也无法解决,后来想用jquery去执行点击 ...
- sbt的安装测试
1.下载 wget https://github.com/sbt/sbt/releases/download/v0.13.15/sbt-0.13.15.tgz 2.安装 tar -zxvf sbt-0 ...
- java二维数组的长度
//多少行 a.length //多少列 a[i].length
- springboot测试时 SpringApplicationConfiguration注解不能用
测试时,@SpringApplicationConfiguration(classes = Application.class) 报错,注解不能导入. 在学习spring boot时,按照文档学习时测 ...
- MySQL的事务处理及隔离级别
事务是DBMS得执行单位.它由有限得数据库操作序列组成得.但不是任意得数据库操作序列都能成为事务.一般来说,事务是必须满足4个条件(ACID) 原子性(Autmic):事务在执行性,要 ...
- sessionStorage和localStorage
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage. sessionStorage用于本地存储一个会话(session)中的数据,这些数据只 ...
- @Transactionl注解
spring 事务注解 默认遇到throw new RuntimeException("...");会回滚 需要捕获的throw new Exception("...&q ...
- JS中回调函数的使用
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...