传送门

Solution

显然每个点的权值可以由当前点上下左右的树的数量用组合数\(O(1)\)求出,但这样枚举会T

那么我们考虑一段连续区间,对于一行中两个常青树中间的部分左右树的数量一定,我们可用树状数组求区上下贡献值和,相乘就得到了当前区间的贡献。

有思路调不出来系列

Code

#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define Re register
#define Ms(a,b) memset(a,(b),sizeof(a))
#define Fo(i,a,b) for(Re int i=(a),_=(b);i<=_;i++)
#define Ro(i,a,b) for(Re int i=(b),_=(a);i>=_;i--)
using namespace std;
typedef long long LL; inline int read() {
int x=0,f=1;char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
} const int MAXW=1e5+5;
int n,m,W,lx,k,N;
int dx[MAXW],wx[MAXW],d[MAXW],l[MAXW],u[MAXW],r[MAXW];
LL ans,Cc[MAXW][13];
struct Tree{int x,y,id;}T[MAXW]; struct BIT{
LL da[MAXW];
BIT() {clear();}
void clear() {Ms(da,0);}
void add(int x,LL d) {for(;x<=lx;x+=x&-x)da[x]+=d;}
LL qry(int x) {LL t=0;for(;x;x-=x&-x)t+=da[x];return t;}
}B; bool cmpx(Tree a,Tree b) {return a.x==b.x?a.y<b.y:a.x<b.x;}
bool cmpy(Tree a,Tree b) {return a.y==b.y?a.x<b.x:a.y<b.y;} void init() {
sort(T+1,T+1+W,cmpx);
Fo(i,1,W) {
int j=i,now=0;
while(T[j+1].x==T[j].x) j++,d[T[j].id]=++now;
while(i<=j) u[T[i].id]=now--,i++; i--;
N=max(N,d[T[j].id]);
}
sort(T+1,T+1+W,cmpy);
Fo(i,1,W) {
int j=i,now=0;
while(T[j+1].y==T[j].y) j++,l[T[j].id]=++now;
while(i<=j) r[T[i].id]=now--,i++; i--;
N=max(N,l[T[j].id]);
}
Fo(i,0,N) Cc[i][0]=Cc[i][i]=1;
Fo(i,2,N) Fo(j,1,k) Cc[i][j]=Cc[i-1][j]+Cc[i-1][j-1]; sort(dx+1,dx+1+lx); lx=unique(dx+1,dx+1+lx)-dx-1;
Fo(i,1,W) wx[i]=lower_bound(dx+1,dx+1+lx,T[i].x)-dx;
} LL C(int x) {return Cc[x][k];} int main() {
n=read()+1; m=read()+1; W=read();
Fo(i,1,W) dx[++lx]=T[i].x=read()+1,T[i].y=read()+1,T[i].id=i;
k=read(); init();
for(Re int i=1,j;i<=W;i=j+1) {
j=i; B.add(wx[i],C(d[T[i].id]+1)*C(u[T[i].id])-C(d[T[i].id])*C(u[T[i].id]+1));
while(T[j+1].y==T[i].y) {
j++; ans+=C(l[T[j-1].id]+1)*C(r[T[j].id]+1)*(B.qry(wx[j]-1)-B.qry(wx[j-1]));
B.add(wx[j],C(d[T[j].id]+1)*C(u[T[j].id])-C(d[T[j].id])*C(u[T[j].id]+1));
}
}
printf("%d",ans&2147483647);//自然溢出,可以有效简化代码,但易出错,慎用
return 0;
}

[luogu2154 SDOI2009] 虔诚的墓主人(树状数组+组合数)的更多相关文章

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

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

  2. P2154 [SDOI2009]虔诚的墓主人 树状数组

    https://www.luogu.org/problemnew/show/P2154 题意 在一个坐标系中,有w(1e5)个点,这个图中空点的权值是正上,正下,正左,正右各取k个的排列组合情况.计算 ...

  3. BZOJ-1227 虔诚的墓主人 树状数组+离散化+组合数学

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MB Submit: 914 Solved: 431 [Submit][Statu ...

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

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

  5. luogu2154 [SDOI2009] 虔诚的墓主人 离散化 树状数组 扫描线

    题目大意 公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.一块墓地的虔诚度是指以这块墓地为中心的十字架的数目,一个十字架可以看成中间是墓地,墓地的正上.正 ...

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

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

  7. bzoj1227: [SDOI2009]虔诚的墓主人(树状数组,组合数)

    传送门 首先,对于每一块墓地,如果上下左右各有$a,b,c,d$棵树,那么总的虔诚度就是$C_k^a*C_k^b*C_k^c*C_k^d$ 那么我们先把所有的点都给离散,然后按$x$为第一关键字,$y ...

  8. BZOJ1227 [SDOI2009]虔诚的墓主人 【树状数组】

    题目 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地.为 ...

  9. BZOJ 1227 虔诚的墓主人(离散化+树状数组)

    题目中矩形的尺寸太大,导致墓地的数目太多,如果我们统计每一个墓地的虔诚度,超时是一定的. 而常青树的数目<=1e5.这启发我们从树的方向去思考. 考虑一行没有树的情况,显然这一行的墓地的虔诚度之 ...

随机推荐

  1. Test While You Sleep (and over Weekends)

    Test While You Sleep (and over Weekends) Rajith Attapattu RELAX. I am not referring to offshore deve ...

  2. LeetCode 977. Squares of a Sorted Array (有序数组的平方)

    题目标签:Array 题目给了我们一组 从小到大的 integers,让我们平方数字 并且 也排序成 从小到达. 因为有负数在里面,平方后,负数在array的位置会变动. 可以设left 和 righ ...

  3. 嵌入式C语言经常使用keyword

    1.statickeyword 这个keyword前面也有提到.它的作用是强大的. 要对statickeyword深入了解.首先须要掌握标准C程序的组成. 标准C程序一直由下列部分组成:       ...

  4. debian使用过程中常见的问题

    1 wget https://www.dropbox.com ERROR: The certificate of `www.dropbox.com' is not trusted. ERROR: Th ...

  5. Unable to update auto-refresh reference 'microsoft.codedom.providers.dotnetcompilerplatform.dll'.

    Unable to update auto-refresh reference 'microsoft.codedom.providers.dotnetcompilerplatform.dll'. Ca ...

  6. python pass 的用法

    python pass用法 1.空语句 do nothing 2.保证格式完整 3.保证语义完整 4.以if语句为例: C/C++中写法: if(true) ; // do nothing else ...

  7. IDEA maven不能下载源码:" can not download source"问题

    用IDEA无法下载源码,可以在命令行项目根目录下,执行如下命令 :mvn dependency:resolve -Dclassifier=sources下载 也可以在idea设置中设置为自动下载源码

  8. SpringBoot2.0整合SpringSecurity实现WEB JWT认证

    相信很多做技术的朋友都做过前后端分离项目,项目分离后认证就靠JWT,费话不多说,直接上干活(写的不好还请多多见谅,大牛请绕行) 直接上代码,项目为Maven项目,结构如图: 包分类如下: com.ap ...

  9. Vue 柱状图

    echarts.js作为国内的IT三巨头之一的百度的推出一款相对较为成功的开源项目,总体上来说有这样的一些优点 1.echarts.js容易使用 echarts.js的官方文档比较详细,而且官网中提供 ...

  10. 02-vue过滤器和键盘修饰符

    过滤器 概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插值和 v-bind 表达式.过滤器应该被添加在 JavaScript 表达式的 ...