[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 ...
随机推荐
- bzoj 3143: [Hnoi2013]游走
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- Tensorflow之MNIST机器学习入门
MNIST机器学习的原理: 通过一次次的 输入某张图片的像素值(用784维向量表示)以及这张图片对应的数字(用10维向量表示比如数字1用[0,1,0,0,0,0,0,0,0,0]表示),来优化10*7 ...
- 1、opencv-2.4.7.2的安装和vs2010的配置
参考大牛们的资料,动手操作了一遍,不算太复杂,和vs2008不同,有几点需要注意,cv2.4.7.2版本没有vc9,所以无法在2008上使用(呵呵,我瞎猜的) 1.下载安装 下载http://sour ...
- Ubuntu配置Django+ Apache2+ mysql
# 我的Ubuntu上自带的python3.5,所以安装一下 python3.6sudo add-apt-repository ppa:jonathonf/python-3.6sudo apt-get ...
- 自动化测试辅助工具(Selenium IDE等)
本随表目录 Selenium IDE安装和使用 FireBug安装和使用 FirePath安装和使用 Selenium IDE安装 方式一:打开Firefox-->添加组件-->搜索出 ...
- 为什么说Python 是大数据全栈式开发语言
欢迎大家访问我的个人网站<刘江的博客和教程>:www.liujiangblog.com 主要分享Python 及Django教程以及相关的博客 交流QQ群:453131687 原文链接 h ...
- Django__WSGI
WEB应用的本质 : 1. 浏览器发送一个http请求 2. 服务器收到请求,生成一个html文档 3. 服务器把HTML文档作为HTTP响应的body发送给浏览器 4. 浏览器收到http响应,从h ...
- RAID常用级别的比较
[转]RAID常用级别的比较 特点 硬盘及容量 性能及安全 典型应用 raid 0 用于平行存储,即条带.其原理是把连续的数据分成几份,然后分散存储到阵列中的各个硬盘上.任何一个磁盘故障,都将导致数据 ...
- Python的可变类型与不可变类型
Python基础知识,自己写一写比较不容易忘 Python的每个对象都分为可变和不可变,主要的核心类型中,数字.字符串.元组是不可变的,列表.字典是可变的. 对不可变类型的变量重新赋值,实际上是重新创 ...
- MicroPython教程之TPYBoard开发板DIY红外寻迹小车
智能小车现在差不多是电子竞赛或者DIY中的主流了,寻迹,壁障,遥控什么的,相信大家也都见得很多了,这次就大家探讨一下寻迹小车的制作方法,不同于以往的是这次的程序不用C语言写,而是要使用python语言 ...