luogu P2154 [SDOI2009]虔诚的墓主人
下面记一个点上下左右点数分别为\(u_i,d_i,l_i,r_i\)
枚举每个中间点太慢了,考虑枚举两个点之间横的一条线段,这里面的点左边点数目都相同,右边点数目都相同,然后只要查一下区间内\(\sum_{i=x_L+1}^{x_R-1} \binom{u_i}{k}\binom{d_i}{k}\)乘上\(\binom{l_L}{k}\binom{r_R}{k}\)就是这一段的贡献.写的时候按照纵坐标排序枚举点,然后每两个相邻点算区间的答案,区间的\(\binom{u_i}{k}\binom{d_i}{k}\)可以树状数组维护,每次处理完这个纵坐标后进行单点修改即可
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double
using namespace std;
const int N=1e5+10;
const LL mod=2147483648;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
struct node
{
int x,y;
bool operator < (const node &bb) const {return x!=bb.x?x<bb.x:y<bb.y;}
}a[N];
int n,kk,bb[N],m;
LL ans,c[N][11],bt[N],nb[N],cl[N],cr[N];
void add(int x,LL y){while(x<=m) bt[x]=(bt[x]+y)%mod,x+=x&(-x);}
LL gsm(int x){LL an=0;while(x) an=(an+bt[x])%mod,x-=x&(-x);return an;}
int main()
{
rd(),rd();
n=rd();
for(int i=1;i<=n;++i)
{
a[i].x=rd(),a[i].y=rd();
bb[++m]=a[i].y;
}
sort(bb+1,bb+m+1),m=unique(bb+1,bb+m+1)-bb-1;
for(int i=1;i<=n;++i) a[i].y=lower_bound(bb+1,bb+m+1,a[i].y)-bb;
sort(a+1,a+n+1);
kk=rd();
for(int i=0;i<=n;++i)
{
c[i][0]=1;
for(int j=1;j<=i&&j<=kk;++j) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
for(int i=1;i<=n;++i) ++cr[a[i].y];
for(int i=1,j=1;i<=n;++j)
{
while(j<n&&a[j+1].x==a[j].x) ++j;
LL nl=1,nr=j-i;
for(int k=i;k<j;++k,++nl,--nr)
ans=(ans+(gsm(a[k+1].y-1)-gsm(a[k].y)+mod)%mod*c[nl][kk]%mod*c[nr][kk]%mod)%mod;
while(i<=j)
{
add(a[i].y,mod-nb[a[i].y]);
++cl[a[i].y],--cr[a[i].y];
nb[a[i].y]=c[cl[a[i].y]][kk]*c[cr[a[i].y]][kk]%mod;
add(a[i].y,nb[a[i].y]);
++i;
}
}
printf("%lld\n",ans);
return 0;
}
luogu P2154 [SDOI2009]虔诚的墓主人的更多相关文章
- bzoj1227 P2154 [SDOI2009]虔诚的墓主人
P2154 [SDOI2009]虔诚的墓主人 组合数学+离散化+树状数组 先看题,结合样例分析,易得每个墓地的虔诚度=C(正左几棵,k)*C(正右几棵,k)*C(正上几棵,k)*C(正下几棵,k),如 ...
- P2154 [SDOI2009]虔诚的墓主人 树状数组
https://www.luogu.org/problemnew/show/P2154 题意 在一个坐标系中,有w(1e5)个点,这个图中空点的权值是正上,正下,正左,正右各取k个的排列组合情况.计算 ...
- [洛谷P2154] SDOI2009 虔诚的墓主人
问题描述 小W是一片新造公墓的管理人.公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. 当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地. ...
- Luogu 2154 [SDOI2009]虔诚的墓主人
弄了很久,状态很烂…… 首先发现可用的点一共只有$1e5$个,所以可以离散化坐标来方便计算. 发现对于一个空格,设它的上.下.左.右分别有$u, d, l, r$个点,它产生的贡献是$\binom{u ...
- P2154 [SDOI2009]虔诚的墓主人
略有一点点思维的题. 首先,如果一个点上,下,左,右分别有\(a,b,c,d\)棵树,那这个点的十字架方案为\(C_{a}^{k}C_{b}^{k}C_{c}^{k}C_{d}^{k}\). 按x坐标 ...
- 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 ...
随机推荐
- C++ 学习时的错误记录
1. 关于C++相关的文件扩展名 c++程序中的头文件扩展名包括: .h .hpp .hxx C++程序中源文件的扩展名包括: .cc .cpp .cxx 2.C++程序编译过程 3. 处理错误 4. ...
- LeetCode 143. 重排链表(Reorder List)
题目描述 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. ...
- DP&图论 DAY 6 上午
DP&图论 DAY 6 上午 双连通分量 从u-->v不存在必经边,点 点双连通分量 边双连通分量 点/边双连通分量缩点之后变成一个树 找连通块的时候不越过割点或者桥 P3469 [ ...
- DAY 6考试
题解: 这题太水辣 注意开 long long 但我不是没开long long 的锅 我是 输出 long long 要用 lld 啊 大梦身先醒,80可海星 PS:百度了一下 long (ld) 和 ...
- CoordinatorLayout使用全解析
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012124438/article/details/56701641 CoordinatorLayo ...
- layui表格遇到的小操作
表头文字显示不全 done:function(res){ tdTitle() }, /*表头文字显示不全*/ function tdTitle(){ $('th').each(function(ind ...
- openerp学习笔记 统计、分析、报表(过滤条件向导、分组报表、图形分析、比率计算、追加视图排序)
待解决:图形中当改变分组时,图例不正确 存储比率计算时,分组合计不正确 wizard:过滤条件向导,用于输入过滤条件 wizard/sale_chart.py # -*- cod ...
- 我非要捅穿这 Neutron(四)Open vSwitch in Neutron
目录 文章目录 目录 前文列表 OvS In Neutron 网络拓扑 OvS In Neutron 网络实现模型 双节点混合平面网络 双节点网络拓扑 OvS Bridges 与初始流表项 OvS b ...
- Java语言 List 和 Array 相互转换
Java语言 List 和 Array 相互转换 List集合 转换为 Array数组 List集合 转换成 Array数组,有 2 种方式,代码如下: import java.util.ArrayL ...
- boost::multi_index 提供一种千人在线即时排行榜的设计思路
原文地址: http://www.limerence2017.com/2019/06/23/cpp01/ 做游戏或金融后台开发,经常会遇到设计开发排行榜的需求.比如玩家的充值排行,战力排行等等.而这种 ...