[bzoj1227] [SDOI2009]虔诚的墓主人
终于填上了这个万年巨坑....从初二的时候就听说过这题...然后一直不敢写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]虔诚的墓主人的更多相关文章
- BZOJ1227 SDOI2009 虔诚的墓主人【树状数组+组合数】【好题】*
BZOJ1227 SDOI2009 虔诚的墓主人 Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. ...
- bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 803 Solved: 372[Submit][Statu ...
- [BZOJ1227][SDOI2009]虔诚的墓主人 组合数+树状数组
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 1433 Solved: 672[Submit][Stat ...
- BZOJ1227 [SDOI2009]虔诚的墓主人 【树状数组】
题目 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地.为 ...
- bzoj1227: [SDOI2009]虔诚的墓主人(树状数组,组合数)
传送门 首先,对于每一块墓地,如果上下左右各有$a,b,c,d$棵树,那么总的虔诚度就是$C_k^a*C_k^b*C_k^c*C_k^d$ 那么我们先把所有的点都给离散,然后按$x$为第一关键字,$y ...
- 【BZOJ1227】[SDOI2009]虔诚的墓主人(线段树)
[BZOJ1227][SDOI2009]虔诚的墓主人(线段树) 题面 BZOJ 洛谷 题解 显然发现答案就是对于每一个空位置,考虑上下左右各有多少棵树,然后就是这四个方向上树的数量中选\(K\)棵出来 ...
- bzoj1227 P2154 [SDOI2009]虔诚的墓主人
P2154 [SDOI2009]虔诚的墓主人 组合数学+离散化+树状数组 先看题,结合样例分析,易得每个墓地的虔诚度=C(正左几棵,k)*C(正右几棵,k)*C(正上几棵,k)*C(正下几棵,k),如 ...
- 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 ...
随机推荐
- iOS 本地项目上传github,github管理项目配置
一.注册github账号 首先需要注册一个github账号,注册地址:https://github.com 接着会来到这 然后会收到一封github发的邮件,进入邮箱验证 二.创建个人的githu ...
- Python 集体智慧编程PDF
集体智慧编程PDF 1.图书思维导图http://www.pythoner.com/183.html p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12. ...
- Linux 学习记录 三(Vim 文书编辑器).
所有的Unix Like系统都会内建vi文书编辑器,其他的文书编辑器不一定存在,vim是vi的升级版,具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计.vim 里 ...
- [置顶]
几行代码实现ofo首页小黄人眼睛加速感应转动
最新版的ofo 小黄车的首页小黄人眼睛随重力而转动,感觉有点炫酷,学习一下吧,以下代码是在xamarin android下实现 ofo首页效果图: xamarin android实现效果: 实现思路: ...
- bzoj 4012: [HNOI2015]开店
Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...
- free 命令详解
作用:显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区 选项: -b 以byte为单位显示内存使用情况 -k 以kb 为单位显示内存使用情况 -m 以mb 为单位显示内存使用情 ...
- windows 运行banana
1 git clone 工程 2 安装 npm 3 执行 npm install -g bower
- 环形进度条的实现方法总结和动态时钟绘制(CSS3、SVG、Canvas)
缘由: 在某一个游戏公司的笔试中,最后一道大题是,“用CSS3实现根据动态显示时间和环形进度[效果如下图所示],且每个圆环的颜色不一样,不需要考虑IE6~8的兼容性”.当时第一想法是用SVG,因为SV ...
- thinkinginjava学习笔记02_对象
对象 1. 对象通过一个引用来操作,但是java中的对象是按值传递的,基本上可以在操作中认为对象本身,在内部结构中仍然要记得是对象实体的引用:如:String s = "abcd" ...
- Spring之设置Bean值
Java实例的属性值可以有很多种数据类型.基本类型值.字符串类型.java实例甚至其他的Bean实例.java集合.数组等.所以Spring允许通过如下几个元素为Bean实例的属性指定值: value ...