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. HTML5(一)初识HTML5

    HTML5 简介 HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定. 目的是为了在移动设备上支持多媒体. HTML5 的改进 完全支持 CSS3 Video 和 ...

  2. SpringCloud系列之集成分布式事务Seata应用篇

    目录 前言 项目版本 项目说明 Seata服务端部署 Seata客户端集成 cloud-web module-order module-cart module-goods module-wallet ...

  3. Xenon's Attack on the Gangs(树规)

    题干 Input Output Example Test 1: Test 2: 3 5 1 2 1 2 2 3 1 3 1 4 3 5 3 10 Tips 译成人话 给n个结点,n-1条无向边.即一棵 ...

  4. STL测试2)计算器简单实现

    实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格  . 示例 1: 输入: "1 + 1" ...

  5. CCNA-Part5 - 传输层 ,TCP 为什么是三次握手?

    传输层 传输层主要的作用就是建立端到端的连接.比如电脑的微信的通信,就需要跨越多个网络设备(交换机和录取)再和微信的服务器建立连接. 传输层需要具有以下的特点: 会话的多复用:如电脑上开启的多个应用, ...

  6. CTF_show平台 web题解 part3

    web13 题目显示文件上传,各类型上传均提示错误,在使用ctf-scan扫描的时候,发现upload.php.bak. 查看源码: <?php header("content-typ ...

  7. JVM 专题十一:运行时数据区(六)方法区

    1. 栈.堆.方法区关系交互 运行时数据区结构图: 从线程共享与否的角度来看: 2. 方法区的理解 2.1 方法区在哪里? <Java虚拟机规范>中明确说明:“尽管所有的方法区在逻辑上属于 ...

  8. java 面向对象(十):关键字:this

    1.可以调用的结构:属性.方法:构造器2.this调用属性.方法:this理解为:当前对象 或 当前正在创建的对象 2.1 在类的方法中,我们可以使用"this.属性"或" ...

  9. python 装饰器(七):装饰器实例(四)类装饰器装饰类以及类方法

    类装饰器装饰类方法 不带参数 from functools import wraps import types class CatchException: def __init__(self,orig ...

  10. selenium 下拉到页面最底端

    selenium操控浏览器下拉到页面最底端: https://www.cnblogs.com/TTyb/p/7662430.html #!/usr/bin/env python # -*- codin ...