终于填上了这个万年巨坑....从初二的时候就听说过这题...然后一直不敢写QAQ

  现在感觉也不是很烦(然而我还是写麻烦了

  离散化一波,预处理出组合数什么的。。

  要维护对于当前行,每列上方和下方节点凑出合法方案的个数。

  然后对于当前行上两棵相邻的常青树,求一下左边、右边合法方案数,乘上中间空的列的合法方案总数就好了。

  单点修改,区间查询。。我竟然跑去写线段树...懒得改了。。

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ui unsigned int
using namespace std;
const int maxn=,mxnode=maxn<<;
struct zs{int v,id;}X[maxn],Y[maxn];
struct poi{int x,y;}a[maxn];
int lc[mxnode],rc[mxnode],num1[mxnode],num2[mxnode],tot;
int mp[maxn],st[maxn],top;
ui sm[mxnode],ans,SM,c[maxn][];
int i,j,k,n,m,kk,L,R,P; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while((rx<''||rx>'')&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra*fh;
}
void build(int a,int b){
int x=++tot;
if(a==b){num2[x]=mp[a];return;}
int mid=a+b>>;
lc[x]=tot+,build(a,mid),rc[x]=tot+,build(mid+,b);
}
void change(int x,int a,int b){
if(a==b){
num1[x]++,num2[x]--,sm[x]=c[num1[x]][kk]*c[num2[x]][kk];
return;
}
int mid=a+b>>;
if(P<=mid)change(lc[x],a,mid);else change(rc[x],mid+,b);
sm[x]=sm[lc[x]]+sm[rc[x]];
}
void query(int x,int a,int b){
if(L<=a&&R>=b){
SM+=sm[x];return;
}
int mid=a+b>>;
if(L<=mid)query(lc[x],a,mid);
if(R>mid)query(rc[x],mid+,b);
} bool cmp(zs a,zs b){return a.v<b.v;}
bool cmpa(poi a,poi b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
int main(){
n=read(),m=read();
n=read();
for(i=;i<=n;i++)X[i].v=read(),Y[i].v=read(),X[i].id=Y[i].id=i;
kk=read();
for(i=;i<=n;i++)c[i][]=;
for(i=;i<=n;i++)for(j=;j<=kk;j++)c[i][j]=c[i-][j]+c[i-][j-];
// for(i=1;i<=n;i++)printf("C(%d %d) %u\n",i,kk,c[i][kk]);return 233; sort(X+,X++n,cmp),sort(Y+,Y++n,cmp);int cntx=,cnty=;
for(i=;i<=n;a[X[i].id].x=cntx,i++)
if(X[i].v!=X[i-].v||i==)cntx++;
for(i=;i<=n;a[Y[i].id].y=cnty,mp[cnty]++,i++)
if(Y[i].v!=Y[i-].v||i==)cnty++;
sort(a+,a++n,cmpa);
build(,cnty); for(i=;i<=n;){
int r=i-,top=;
while(r<n&&a[r+].x==a[i].x)r++,st[++top]=P=a[r].y,change(,,cnty);//,printf(" %d",P);puts("");
if(top>=(kk<<))
for(j=kk;j<=top-kk;j++)if(st[j]+<st[j+])
SM=,L=st[j]+,R=st[j+]-,query(,,cnty),
ans+=SM*c[j][kk]*c[top-j][kk];
i=r+;
}
printf("%d\n",ans<<>>);
}

[bzoj1227] [SDOI2009]虔诚的墓主人的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. scala写算法-快排

    快排算法很经典,今天用scala的函数式思维来整理一下并实现: def qsort(list: List[Int]):List[Int]=list match { case Nil=>Nil c ...

  2. Smart line Panel和S7-200的MPI通信

    1.系统组成 2.一个简单任务 3.设置S7-200的通信参数 1)新建工程,设置CPU类型 2)设置端口1的通讯参数PLC地址为2,波特率187.5kbps 组态 3)保存完成配置 4.组态Smar ...

  3. SSH远程登录密码尝试

    import threading #创建一个登陆日志,记录登陆信息 paramiko.util.log_to_file('paramiko.log') client = paramiko.SSHCli ...

  4. JaCoCo 代码覆盖率工具(基于Maven+TestNG)

    JaCoco是一个代码覆盖率库. 官方网站:http://www.jacoco.org/ 安装: 以 Maven(http://www.testclass.net/maven/) 安装为例: < ...

  5. Golang文件IO 一

    Golang文件IO 一 文件IO编程最基本.最常用的就属读写文件操作了.ioutil包实现了一些IO实用功能,其中就包括非常简捷.好用的文件读取功能. ioutil包有7个函数1个变量: var D ...

  6. linux部署solr服务--小记

    1.将solr压缩包上传到web项目-solr文件夹下 2.解压solr-5.5.4.zip到当前文件夹下 linux 解压zip文件到当前目录 unzip filename.zip 提示没有unzi ...

  7. Java Serializable接口(序列化)理解及自定义序列化

      1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ...

  8. thinkinginjava学习笔记05_访问权限

    Java中访问权限等级从大到小依次为:public.protected.包访问权限(没有关键词).private: 以包访问权限为界限,public.protected分别可以被任意对象和继承的对象访 ...

  9. pagelatch等待在tempdb的gsm页面上

    Each data file has a gam page, sql will update it when allocate space in the file. Will see contenti ...

  10. golang 栈操作

    Monk's Love for Food   Our monk loves food. Hence,he took up position of a manager at Sagar,a restau ...