Solution

离散化 扫描线, 并用 $rest[i]$ 和 $cnt[i]$ 记录 第$i$列 总共有 $cnt[i]$棵常青树, 还有$rest[i]$ 没有被扫描到。

那么 第$i$ 列的方案数 为 $C(rest[i], k) * C(cnt[i]-rest[i], k)$。 乘上行上的方案数 并加入答案。

需要注意组合数要预处理, 我直接算发现$k > 2$就会WA。

Code

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define rd read()
#define R register
using namespace std; const int N = 2e5 + ; int cnt[N], sum[N], n, r, l, k, rest[N];
int vis[], ans;
int tot_x, tot_y, X[N], Y[N], c[N][]; struct node {
int x, y;
}pt[N]; vector<node> q[N]; inline int read() {
R int X = , p = ; char c = getchar();
for (; c > '' || c < ''; c = getchar())
if (c == '-') p = -;
for (; c >= '' && c <= ''; c = getchar())
X = X * + c - '';
return X * p;
} inline int lowbit(int x) {
return x & -x;
} inline void add(R int x, int d) {
for (;x <= tot_x; x += lowbit(x))
sum[x] += d;
} inline int query(R int x) {
int re = ;
for (; x; x -= lowbit(x))
re += sum[x];
return re;
} inline int fd_x(R int x) {
return lower_bound(X + , X + + tot_x, x) - X;
} inline int fd_y(R int y) {
return lower_bound(Y + , Y + + tot_y, y) - Y;
} inline int cmp(const node &A, const node &B) {
return A.y == B.y ? A.x < B.x : A.y < B.y;
} inline int C(int x) {
return c[x][k];
} int work(int x) {
int len = q[x].size(), re = ;
for (R int j = k - ; j <= len - k - ; ++j) {
int L = q[x][j].x, r = q[x][j + ].x;
int tmp = query(r - ) - query(L);
re += tmp * C(j + ) * C(len - j - );
}
for (R int j = ; j < len; ++j) {
int tmp = C(rest[q[x][j].x]) * C(cnt[q[x][j].x] - rest[q[x][j].x]);
add(q[x][j].x, -tmp);
rest[q[x][j].x]--;
tmp = C(rest[q[x][j].x]) * C(cnt[q[x][j].x] - rest[q[x][j].x]);
add(q[x][j].x, tmp);
}
return re;
} void init() {
c[][] = ;
for (int i = ; i <= n; ++i) {
c[i][] = ;
for (int j = ; j <= min(k, i); ++j)
c[i][j] = c[i - ][j - ] + c[i - ][j];
}
} int main()
{
r = rd, l = rd; n = rd;
for (R int i = ; i <= n; ++i) {
pt[i].x = rd, pt[i].y = rd;
X[++tot_x] = pt[i].x;
Y[++tot_y] = pt[i].y;
}
k = rd;
init();
sort(X + , X + + tot_x);
sort(Y + , Y + + tot_y);
tot_x = unique(X + , X + + tot_x) - X - ;
tot_y = unique(Y + , Y + + tot_y) - Y - ;
sort(pt + , pt + + n, cmp);
for (R int i = ; i <= n; ++i) {
pt[i].x = fd_x(pt[i].x);
pt[i].y = fd_y(pt[i].y);
cnt[pt[i].x]++;
q[pt[i].y].push_back(pt[i]);
}
for (R int i = ; i <= tot_x; ++i)
rest[i] = cnt[i];
for (R int i = ; i <= tot_y; ++i)
ans += work(i);
printf("%d\n", ans & 0x7fffffff);
}

BZOJ 1227 [SDOI2009]虔诚的墓主人 - 扫描线的更多相关文章

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

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

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

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

  3. 【以前的空间】bzoj 1227 [SDOI2009]虔诚的墓主人

    题解:hzw大神的博客说的很清楚嘛 http://hzwer.com/1941.html 朴素的做法就是每个点如果它不是墓地那么就可形成十字架的数量就是这个c(点左边的树的数量,k)*c(点右边的树的 ...

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

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

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

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

  6. [BZOJ1227][SDOI2009]虔诚的墓主人 组合数+树状数组

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

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

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

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

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

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

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

随机推荐

  1. yii2.0 手动配置redis

    手动安装yii2.0-redis扩展 1.点击下载:yii2.0-redis扩展 2.把下载的扩展文件放到vendor/yiisoft/下,命名为yii2-redis 3.修改vender/yiiso ...

  2. Java中的IO流(一)

    一,IO流的分类 A,按照操作的对象不同可分为字节流与字符流 B,按照流的方向不同可分为输入(指从外部存储设备拿文件到内存)流也叫读与输出(指从内存把文件写入到外部存储设备)流也叫写 注:字节流可以操 ...

  3. Linux yum安装MySQL5.7

    一.安装配置MySQL的yum源 # 安装MySQL的yum源,下面是RHEL6系列的下载地址 rpm -Uvh http://dev.mysql.com/get/mysql-community-re ...

  4. arachni安装使用

    下载:http://www.arachni-scanner.com/download/#linux 解压到不是中文的目录下:tar -zxvf arachni-1.5.1-0.5.12-linux-i ...

  5. centos7 脚本搭建SVN

    #!/usr/bin/env bash #安装软件 HTTP 和 SVN软件 yum install -y httpd subversion mod_dav_svn #创建库文件夹并更改文件夹权限 m ...

  6. 数论----gcd和lcm

    gcd即最大公约数,lcm即最小公倍数. 首先给出a×b=gcd×lcm 证明:令gcd(a,b)=k,a=xk,b=yk,则a×b=x*y*k*k,而lcm=x*y*k,所以a*b=gcd*lcm. ...

  7. pta6-17(另类堆栈)

    题目链接:https://pintia.cn/problem-sets/1101307589335527424/problems/1101313244872126464 题意:一种新的堆栈,用Top表 ...

  8. 排列组合或容斥原理 SPOJ - AMR11H

    题目链接: https://vjudge.net/contest/237052#problem/H 这里给你一串数字,让你计算同时拥有这串数字最大值和最小值的子集(连续)和子序列(可以不连续)的数量, ...

  9. php项目执行composer install时报错

    报错信息: Loading composer repositories with package informationInstalling dependencies (including requi ...

  10. 伪异步IO

    针对传统的BIO编程,当客户端数量一直增加的情况下,可能会导致服务器直接奔溃掉,进而出现了一种伪异步IO的线程方式. 先看一下代码: 看一下server端的代码: 其中使用了自定义的一个线程池Hand ...