1227: [SDOI2009]虔诚的墓主人

Time Limit: 5 Sec  Memory Limit: 259 MB
Submit: 1083  Solved: 514
[Submit][Status][Discuss]

Description

小W 是一片新造公墓的管理人。公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地。当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地。为了体现自己对主的真诚,他们希望自己的墓地拥有着较高的虔诚度。一块墓地的虔诚度是指以这块墓地为中心的十字架的数目。一个十字架可以看成中间是墓地,墓地的正上、正下、正左、正右都有恰好k 棵常青树。小W 希望知道他所管理的这片公墓中所有墓地的虔诚度总和是多少

Input

第一行包含两个用空格分隔的正整数N 和M,表示公墓的宽和长,因此这个矩形公墓共有(N+1) ×(M+1)个格点,左下角的坐标为(0, 0),右上角的坐标为(N, M)。第二行包含一个正整数W,表示公墓中常青树的个数。第三行起共W 行,每行包含两个用空格分隔的非负整数xi和yi,表示一棵常青树的坐标。输入保证没有两棵常青树拥有相同的坐标。最后一行包含一个正整数k,意义如题目所示。

Output

包含一个非负整数,表示这片公墓中所有墓地的虔诚度总和。为了方便起见,答案对2,147,483,648 取模。

Sample Input

5 6
13
0 2
0 3
1 2
1 3
2 0
2 1
2 4
2 5
2 6
3 2
3 3
4 3
5 2
2

Sample Output

6

HINT

图中,以墓地(2, 2)和(2, 3)为中心的十字架各有3个,即它们的虔诚度均为3。其他墓地的虔诚度为0。

所有数据满足1 ≤ N, M ≤ 1,000,000,000,0 ≤ xi ≤ N,0 ≤ yi ≤ M,1 ≤ W ≤ 100,000, 1 ≤ k ≤ 10。存在50%的数据,满足1 ≤ k ≤ 2。存在25%的数据,满足1 ≤ W ≤ 10000。

注意:”恰好有k颗树“,这里的恰好不是有且只有,而是从>=k的树中恰好选k棵

Source

O(nm)暴力:sigma(C(l(x,y),k)*C(r(x,y),k)*C(u(x,y),k)*C(d(x,y),k))((x,y)是整个地图上任意一点,l,r,u,d分别表示点(x,y)正左/右/上/下方的点数,C表示组合数)。

优化:
先将所有常青树以y坐标为第一关键字,x坐标为第二关键字,从小到大排序。对于第i棵常青树,如果第i-1棵常青树的y坐标与它相同,那么两棵常青树之间的空地的虔诚度之和为:

C(l(i-1),k)*C(r(i),k)*sigma(C(u(x),k)*C(d(x),k))(x介于第i-1~第i棵常青树之间。其中l(i-1)表示与第i-1棵常青树y坐标相同,且x坐标小于等于它的常青树数量,r(i)则表示与第i棵常青树y坐标相同,且x坐标大于等于它的常青树数量;u(x),d(x)表示点(x,y)正上/下方有多少常青树,C表示组合数)。

于是我们从左往右处理某行的某一个点时,要将树状数组中该点横坐标位置上的数进行修改

修改的值为就是现在的c(u[i],k)*c[d[i],k]减去原来的,也就是c(u[i],k)*c[d[i],k]-c(u[i]+1,k)*c[d[i]-1,k]

ps:网上有些人让ans自然溢出,可以加快速度。

  我只想说NO ZUO NO DIE。

别为了速度,WA了本可以过的点,那就得不偿失了!(因为我这样干过。。。)

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod=2147483648LL;
const int N=2e5+5;
struct node{int x,y;
}a[N];
int n,m,w,K,cnt,H[N],h[N],l[N],now[N];
ll ans,f[N],C[N][11];//WA*1 看成50%的数据了
void getc(){C[0][0]=1;for(int i=1;i<=w;i++){C[i][0]=1;for(int j=1;j<=min(K,i);j++){C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;}}
}
int find(int x){int l=1,r=cnt,mid;while(l<=r){mid=l+r>>1;if(H[mid]==x) return mid;if(H[mid]>x) r=mid-1;else l=mid+1;}
}
int lowbit(int x){return x&-x;
}
void updata(int x,ll val){for(int i=x;i<=cnt;i+=lowbit(i)) f[i]=(f[i]+val)%mod;
}
ll query(int x){ll res=0;for(int i=x;i;i-=lowbit(i)) res=(res+f[i])%mod;return res;
}
bool cmp(const node &a,const node &b){return a.y==b.y?a.x<b.x:a.y<b.y;
}
int main(){scanf("%d%d%d",&m,&n,&w);for(int i=1;i<=w;i++){scanf("%d%d",&a[i].x,&a[i].y);H[++cnt]=a[i].x;H[++cnt]=a[i].y;}sort(H+1,H+cnt+1);scanf("%d",&K);getc();sort(a+1,a+w+1,cmp);for(int i=1;i<=w;i++) h[find(a[i].y)]++,l[find(a[i].x)]++;int lf=0;for(int i=1,d;i<=w;i++){if(i>1&&a[i-1].y==a[i].y){lf++;ll t1=query(find(a[i].x)-1)-query(find(a[i-1].x));ll t2=C[lf][K]*C[h[find(a[i].y)]-lf][K];//WA*2 忘了-1 ans+=t1*t2;ans%=mod;}else lf=0;d=find(a[i].x);now[d]++;ll change=(C[now[d]][K]*C[l[d]-now[d]][K]-C[now[d]-1][K]*C[l[d]-now[d]+1][K])%mod;//c(u[i],k)*c[d[i],k]-c(u[i]+1,k)*c[d[i]-1,k]
        updata(d,change); }if(ans<0) ans+=mod;printf("%d",(int)ans);return 0;
}

转载于:https://www.cnblogs.com/shenben/p/6287379.html

1227: [SDOI2009]虔诚的墓主人相关推荐

  1. bzoj 1227 [SDOI2009]虔诚的墓主人

    疯狂re 换了一种写法才过... 思路:将x轴离散化,处理出来每个点上下左右一个有多少个点, 对于同一行的两个点来说,他们之间的 这些空的点都是可以一起算的,我们用树状数组按y轴从小到大维护 每一列的 ...

  2. BZOJ1227 [SDOI2009]虔诚的墓主人 【树状数组】

    题目 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地.为 ...

  3. bzoj1227: [SDOI2009]虔诚的墓主人(树状数组,组合数)

    传送门 首先,对于每一块墓地,如果上下左右各有$a,b,c,d$棵树,那么总的虔诚度就是$C_k^a*C_k^b*C_k^c*C_k^d$ 那么我们先把所有的点都给离散,然后按$x$为第一关键字,$y ...

  4. [SDOI2009]虔诚的墓主人

    这个题是今天上午模拟赛做的,考场上代码最后时间紧写得巨丑,所以改完以后还是巨丑 80分做法 这是考场上写的,然而数学实在太渣,不知道在模数下不能做除法,组合数部分写ci了 组合数预处理 首先都知道组合 ...

  5. 虔诚的墓主人(bzoj 1227)

    Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己 ...

  6. 【SDOI2009】【BZOJ1227】虔诚的墓主人

    Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己 ...

  7. 2017.9.24 虔诚的墓主人 思考记录

    这个题是纯信息处理题. 首先要明白,对墓地进行枚举是会T的,需要对常青树进行枚举 所以枚举的顺序也要注意:一定要按某种顺序 然后要明白,每一个常青树会对列和行都造成影响,对答案有贡献的点只会在两个点之 ...

  8. bzoj-1227 虔诚的墓主人

    题意: 在一个nxm的矩形里给出一些w个点,这些是常青树的坐标: 求所有空地上下左右能组成的长度为k的十字架的总数: 1<=n,m<=10^9,1<=w<=100000,1&l ...

  9. linux单机到单机adg环境,Oracle 11.2.0.4 DataGuard 环境打PSU,OJVM PSU补丁快速参考

    环境:RHEL6.5 + Oracle 11.2.0.4 DataGuard physical standby 主库和备库都是单节点. 需求:主备库同时应用160719的PSU和OJVM PSU补丁. ...

最新文章

  1. Java面向对象知识概括归纳与总结
  2. 戴森最新吸尘器,竟用上了无人车和宇宙飞船黑科技
  3. BZOJ3526[Poi2014]Card——线段树合并
  4. 经典C语言程序100例之四八
  5. 优秀学生专栏——孙珩发
  6. LeetCode MySQL 615. 平均工资:部门与公司比较(over窗口函数)
  7. 万字长文!不为人所知的分布式锁实现全都在这里了
  8. linux分割内容单引号,linux变量、cut_sort_wc_uniq_tee_tr_split 命令使用方法
  9. nlp-tutorial代码注释3-2,LSTM简介
  10. pythonexcel怎么合并_Python把多个Excel合并成一个Excel
  11. python:TypeError: ‘dict_keys‘ object does not support indexing
  12. 2004-2020年数学建模美赛O奖论文合集(免费)
  13. [ProblemSolving]ut下载磁盘负荷过重
  14. 重置mysql数据库密码_重置mysql数据库密码的方法
  15. Python模拟黑客帝国影片中的终端动画脚本
  16. 斯皮尔曼相关系数计算的python代码
  17. [解决]Windows 8 丢失 MSVCR71.dll 或 MSVCP71.dll
  18. PHP 判断日期格式
  19. The server time zone value .. is unrecognized or represents more than one time zone
  20. [Luogu P3613] 睡觉困难综合征

热门文章

  1. Shell脚本基本用法
  2. 亲密关系沟通--【修复关系】-用沟通疗愈伤害
  3. 有了这些接口测试用例+工具,测试效率想不提升都难
  4. 我,23 岁 深漂女 Python自动化测试的心路历程|2021 总结
  5. matlab 非线性电感,基于Matlab/Simulink利用动态和静态电感等磁参数建立了一种开关磁阻电机的非线性磁参数模型...
  6. layui怎样将响应数据展示在页面_layui-table对返回的数据进行转变显示的实例
  7. html在线测试 css,HTML+CSS测试
  8. std在汇编语言是什么指令_汇编语言程序指令整理
  9. 高通运行linux,Linux实现对高通多核支持
  10. 入党对程序员有什么用_为什么程序员都喜欢用两个大屏显示器?网友:一个复制一个粘贴...