弄了很久,状态很烂……

首先发现可用的点一共只有$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]虔诚的墓主人的更多相关文章

  1. luogu P2154 [SDOI2009]虔诚的墓主人

    luogu 下面记一个点上下左右点数分别为\(u_i,d_i,l_i,r_i\) 枚举每个中间点太慢了,考虑枚举两个点之间横的一条线段,这里面的点左边点数目都相同,右边点数目都相同,然后只要查一下区间 ...

  2. BZOJ1227或洛谷2154 [SDOI2009]虔诚的墓主人

    BZOJ原题链接 洛谷原题链接 又是扫描线,题解可看大佬的博客(太懒了不想打) #include<cstdio> #include<algorithm> using names ...

  3. BZOJ 1227: [SDOI2009]虔诚的墓主人

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec  Memory Limit: 259 MBSubmit: 1078  Solved: 510[Submit][Stat ...

  4. Bzoj 1227: [SDOI2009]虔诚的墓主人 树状数组,离散化,组合数学

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec  Memory Limit: 259 MBSubmit: 895  Solved: 422[Submit][Statu ...

  5. bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec  Memory Limit: 259 MBSubmit: 803  Solved: 372[Submit][Statu ...

  6. 1227: [SDOI2009]虔诚的墓主人

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec  Memory Limit: 259 MBSubmit: 1083  Solved: 514[Submit][Stat ...

  7. bzoj1227 P2154 [SDOI2009]虔诚的墓主人

    P2154 [SDOI2009]虔诚的墓主人 组合数学+离散化+树状数组 先看题,结合样例分析,易得每个墓地的虔诚度=C(正左几棵,k)*C(正右几棵,k)*C(正上几棵,k)*C(正下几棵,k),如 ...

  8. 【BZOJ1227】[SDOI2009]虔诚的墓主人(线段树)

    [BZOJ1227][SDOI2009]虔诚的墓主人(线段树) 题面 BZOJ 洛谷 题解 显然发现答案就是对于每一个空位置,考虑上下左右各有多少棵树,然后就是这四个方向上树的数量中选\(K\)棵出来 ...

  9. BZOJ1227 SDOI2009 虔诚的墓主人【树状数组+组合数】【好题】*

    BZOJ1227 SDOI2009 虔诚的墓主人 Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. ...

随机推荐

  1. 内置锁(三)synchronized的几个要注意的对象监视器

    前言    经过前面的两篇文章的介绍,可以清楚知道,synchronized可以用于修饰一个方法 或者 代码块,线程要访问这些临界区代码,则要先获取对应的 对象监视器 ,从而使多个线程互斥访问临界区. ...

  2. js、C#获取当前url的参数值

    之前很想做一些封装关于获取URL参数值方法,今天简单整理了一下js和后台代码获取url参数值的方法,有什么不好地方,还请大家包涵,代码如下: 1.JS处理URL参数值 <script langu ...

  3. tornado-简单的服务器

    安装tornado pip install tornado 安装sqlalchemy 1.大概代码的解释 import tornado.ioloop #开启循环,等待访问 import tornado ...

  4. 超酷的Prezi在线ppt制作网站

    prezi.com 你还在用office Power Point 制作PPT吗? 使用prezi.com制作ppt试试.http://prezi.com/explore/staff-picks/

  5. HTML5播放器 MediaElement.js 使用方法

    目前已经有很多html5播放器可以使用,使用html5播放器可以轻松的在页面中插入媒体视频,从而使我们的web页面变得更加丰富多彩,所以今 天向大家推荐一款非常优秀的html5播放器MediaElem ...

  6. sql 数据库修复

    数据库修复 exec sp_dboption 'dbname1','single user',‘true’ dbcc checkdb('dbname1') dbcc checkdb('dbname1' ...

  7. UI5-文档-4.2-Bootstrap

    在使用SAPUI5做一些事情之前,我们需要加载并初始化它.加载和初始化SAPUI5的过程称为引导.一旦引导完成,我们只需显示一个警告. Preview An alert "UI5 is re ...

  8. Oracle 11g超详细安装步骤

    一.首先是Oracle的安装 软件请自行到网上下载 18.等待,出现选择项时点击next 二.打开服务 三.验证数据库是否安装成功

  9. GIS on CentOS 7 之 PostgreSQL & PostGIS

    PostgreSQL & PostGIS 安装postgresql 配置好yum源之后,使用yum info postgresql可发现 postgresql的版本为9.2.23,若想安装最新 ...

  10. delphi 中判断对象是否具备某一属性

    Uses   TypInfo;         {$R   *.dfm}         procedure   TForm1.Button1Click(Sender:   TObject);     ...