SDOI2009虔诚的墓主人

喜闻乐见,我终于把此题读懂了。。所以可以写了。

其实就是让我们求有多少个十字架 一个十字架的定义为中间有一个空地 周围4个正方向都有k棵树。

不难想到nm的暴力 我们预处理一下当前行有多少棵树 当前列有多少棵树 用组合数算一下即可。

如何优化 我们发现在暴力的过程中很多点的代价是相同的 可以考虑将这些点压到一起来计算。

我们发现对于所有的行来说 两颗树之间的空隙 答案可能相同。

不妨枚举所有的行的空隙 考虑如何求出答案 我们对列求方案数的和乘起来即可。

列怎么维护方案数?可以采用线段树或者树状数组来搞 注意离散化。。

这里取模对2^31次方取模 挺有意思的 这个是在提醒我们直接int即可 不能开unsigned int 这个是对2^32次方取模 如果爆int了那么符号为翻转 所以直接int即可。

但是组合数就不能再预处理阶乘了 可能存在某些数字是没有逆元的 好像不互质都没逆元来着。

递推组合数即可。由于还要搞行的方案数建议也离散一下 不然需要开map...

题解中写的一堆看不懂东西 我也没管 方法好像是一样的。

const int MAXN=100010<<1;
int n,m,w,k,ans,top;
struct wy
{
int x,y;
inline int friend operator <(wy a,wy b){return a.y==b.y?a.x<b.x:a.y<b.y;}
}t[MAXN];
int b[MAXN];
int c[MAXN][11];
int pos[MAXN],pos1[MAXN];
int s[MAXN],sum[MAXN],sum1[MAXN];
inline void prepare()
{
c[0][0]=1;
for(int i=1;i<=w;++i)
{
c[i][0]=1;
for(int j=1;j<=min(i,k);++j)
c[i][j]=c[i-1][j]+c[i-1][j-1];
}
}
inline void discrete()
{
sort(b+1,b+1+w*2);
rep(1,w+w,i)if(i==1||b[i]!=b[i-1])b[++top]=b[i];
rep(1,w,i)
{
y(i)=lower_bound(b+1,b+1+top,y(i))-b;
x(i)=lower_bound(b+1,b+1+top,x(i))-b;
}
}
inline void add(int x,int y){while(x<=top){s[x]+=y;x+=x&(-x);}}
inline int ask(int x){int cnt=0;while(x){cnt+=s[x];x-=x&(-x);};return cnt;}
int main()
{
freopen("1.in","r",stdin);
get(n);get(m);get(w);
rep(1,w,i)get(x(i)),b[i]=get(y(i)),b[i+w]=x(i);
get(k);discrete();prepare();
rep(1,w,i)++pos1[y(i)],++sum[x(i)];
sort(t+1,t+1+w);
int last=-1,p=0;
rep(1,w,i)
{
if(y(i)==last)
{
if(x(i)!=p+1)
{
int w=ask(x(i)-1)-ask(p);
int w1=c[pos1[y(i)]-pos[y(i)]][k]*c[pos[y(i)]][k];
ans+=w*w1;
}
}
last=y(i),p=x(i);
++pos[y(i)];
add(x(i),-c[sum[x(i)]][k]*c[sum1[x(i)]][k]);
--sum[x(i)];++sum1[x(i)];
add(x(i),c[sum[x(i)]][k]*c[sum1[x(i)]][k]);
}
printf("%d\n",(ans+mod)%mod);
return 0;
}

值得一提的是 我写的时候没考虑清楚 行列没分清 所以代码中写的是逐列的 和上文刚好相反。。

luoguP2154 [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. bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)

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

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

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

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

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

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

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

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

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

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

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

  9. 【LG2154】[SDOI2009]虔诚的墓主人

    [LG2154][SDOI2009]虔诚的墓主人 题面 洛谷 题解 如果您没有看懂题,请反复阅读题面及样例 可以发现,对于某一个点,它的答案就是上下左右几个组合数乘起来. 这样直接做复杂度显然爆炸,考 ...

随机推荐

  1. requirejs之demo

    具体的理论就不讲了,可以参考 http://www.ruanyifeng.com/blog/2012/10/javascript_module.html http://www.ruanyifeng.c ...

  2. 切忌一步到位,谈谈DevOps实施落地

    2020年6月19日,由云计算开源产业联盟指导,高效运维社区和 DevOps 时代社区联合举办的GNSEC 2020线上峰会圆满举办.BoCloud博云参加了本次峰会并分享了博云帮助客户实施DevOp ...

  3. 在windows中使用labelimg工具搭建图像标注小环境

    文章分成两个部分,第一部分,labelimg工具的安装:第二部分,labelimg工具的使用方法. 第一部分:工具安装 方法一:直接使用网上编译好的Labelimg可执行文件(12.6M),双击执行即 ...

  4. Linux多任务编程之六:编写多进程程序及其代码(转)

    来源:CSDN  作者:王文松  转自Linux公社 ------------------------------------------------------------------------- ...

  5. day23 作业

    day23 作业 目录 day23 作业 1.把登录与注册的密码都换成密文形式 2.文件完整性校验(考虑大文件) 3.注册功能改用json实现 4.项目的配置文件采用configparser进行解析 ...

  6. 机器学习实战基础(二十六):sklearn中的降维算法PCA和SVD(七) 附录

  7. css换行后缩进,css缩进技巧

    一般情况下像下图这样需要缩进的,一般都会外面一个div里面两块需要两个div然后用定位或者flex.table.浮动后设置宽度等来实现 已知宽度的情况下上面列的方法都适用 不知宽度的情况下可以用fle ...

  8. Spring升级案例之IOC介绍和依赖注入

    Spring升级案例之IOC介绍和依赖注入 一.IOC的概念和作用 1.什么是IOC 控制反转(Inversion of Control, IoC)是一种设计思想,在Java中就是将设计好的对象交给容 ...

  9. 5分钟带你快速入门和了解 OAM Kubernetes

    什么是 OAM? OAM 的全称为开放应用模型(Open Application Model),由阿里巴巴宣布联合微软共同推出. OAM 解决了什么问题? OAM 本质是为了解耦K8S中现存的形形色色 ...

  10. ajax配合art-template模板引擎的使用

    最近才接触js的模板引擎听说相比以前使用的js foreach加载后台返回的json数据简便很多而且效率方面也很不错.今天自己玩了一下 后台使用的是.net mvc,数据库脚本就不提供了,返回的Jso ...