luoguP2154 [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]虔诚的墓主人的更多相关文章
- 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 ...
- bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 803 Solved: 372[Submit][Statu ...
- 1227: [SDOI2009]虔诚的墓主人
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 1083 Solved: 514[Submit][Stat ...
- bzoj1227 P2154 [SDOI2009]虔诚的墓主人
P2154 [SDOI2009]虔诚的墓主人 组合数学+离散化+树状数组 先看题,结合样例分析,易得每个墓地的虔诚度=C(正左几棵,k)*C(正右几棵,k)*C(正上几棵,k)*C(正下几棵,k),如 ...
- 【BZOJ1227】[SDOI2009]虔诚的墓主人(线段树)
[BZOJ1227][SDOI2009]虔诚的墓主人(线段树) 题面 BZOJ 洛谷 题解 显然发现答案就是对于每一个空位置,考虑上下左右各有多少棵树,然后就是这四个方向上树的数量中选\(K\)棵出来 ...
- BZOJ1227 SDOI2009 虔诚的墓主人【树状数组+组合数】【好题】*
BZOJ1227 SDOI2009 虔诚的墓主人 Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. ...
- [BZOJ1227][SDOI2009]虔诚的墓主人 组合数+树状数组
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 1433 Solved: 672[Submit][Stat ...
- 【LG2154】[SDOI2009]虔诚的墓主人
[LG2154][SDOI2009]虔诚的墓主人 题面 洛谷 题解 如果您没有看懂题,请反复阅读题面及样例 可以发现,对于某一个点,它的答案就是上下左右几个组合数乘起来. 这样直接做复杂度显然爆炸,考 ...
随机推荐
- 阿里P7岗位面试,面试官问我:为什么HashMap底层树化标准的元素个数是8
前言 先声明一下,本文有点标题党了,像我这样的菜鸡何德何能去面试阿里的P7岗啊,不过,这确实是阿里p7级岗位的面试题,当然,参加面试的人不是我,而是我部门的一个大佬.他把自己的面试经验分享给了我,也让 ...
- Linux 字符处理之【grep】
参数: -i: 不区分大小写 -c: 统计包含匹配的行数 -n: 输出行号 -v: 反向匹配 示例文件: (example.txt) The cat's name is Tom, what's the ...
- 一个howdoo的预兆
原文链接:https://medium.com/howdoo/its-an-omen-for-howdoo-b33b831ed936 它是一个预兆.它是刻在墙上的.它不会消失 随着越来越多的人对Fac ...
- 【题解】p2388阶乘之乘
原题传送门 题解一堆\(O(n)\)算法真给我看傻了. 考虑\(10=2*5\),因子2肯定更多,所以计算因子5的个数即可. 从5到n这\(n-5+1\)个数的阶乘里面,都各自含有一个因子\(5=1* ...
- 核心知识点:python入门
目录 一.python入门day1-day24 day01-03 编程语言 day04 变量 day05 垃圾回收机制(GC机制) 1 引用计数 2 标记清除 3 分代回收 day05 程序交互与基本 ...
- 006.Nginx访问控制
一 Nginx连接限制 1.1 HTTP协议的连接与请求 HTTP是建立在TCP, 一次HTTP请求需要先建立TCP三次握手(称为TCP连接),在连接的基础上再进行HTTP请求. HTTP请求建立在一 ...
- 记一次开发CefSharp做浏览器时Shopify绑定不上Paypal问题
问题:CefSharp做浏览器时Shopify绑定不上Paypal. shopify绑定Paypal的流程大概是如下图所示 步骤1 步骤2 步骤3 步骤4 出现问题大概是在绑定最后一步,并没有如愿的返 ...
- JVM 专题三:类加载子系统(一)类装载器子系统
类装载器子系统 1.1 什么是类装载子系统? 类装载器子系统负责从文件系统或者网络中加载Class文件,Class文件在文件开头有特定的文件标识(魔数). 类装载器子系统(ClassLoader)只负 ...
- java 面向对象(十七):单元测试方法
* Java中的JUnit单元测试 * * 步骤: * 1.中当前工程 - 右键择:build path - add libraries - JUnit 4 - 下一步 * 2.创建Java类,进行单 ...
- hls&flv直播请求过程
hls&flv直播请求过程 直播类产品层出不穷,从各方面塑造了我们的生活方式.直播产品中,延时是决定用户体验的关键因素,它也将间接决定直播产品的成败.这其间,对延时影响较大的就是直播架构中选择 ...