【SDOI2009】【BZOJ1227】虔诚的墓主人
来源:互联网 发布:kmp next函数算法流程 编辑:程序博客网 时间:2024/04/30 17:17
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。 对于30%的数据,满足1 ≤ N, M ≤ 1,000。对于60%的数据,满足1 ≤ N, M ≤ 1,000,000。对于100%的数据,满足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。
Source
智商不足,这题真的好难….
黄学长题解
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define LL long long#define MAXN 100010#define P 2147483648ll#define lowbit(x) (x&(-x))#define GET (ch>='0'&&ch<='9')using namespace std;int n,m,k,w;int sta[MAXN<<1],cnt;LL c[MAXN<<1],C[MAXN][11],ans;int cntx[MAXN<<1],cnty[MAXN<<1],now[MAXN<<1];void in(int &x){ char ch=getchar();x=0; while (!GET) ch=getchar(); while (GET) x=x*10+ch-'0',ch=getchar();}struct node { int x,y; bool operator <(const node& a)const { return y==a.y?x<a.x:y<a.y; }}s[MAXN];void add(int x,LL delta) { for (;x<=(w<<1);x+=lowbit(x)) (c[x]+=delta)%=P; }LL query(int x){ LL ret=0; for (;x;x-=lowbit(x)) (ret+=c[x])%=P; return ret;}int main(){ in(n);in(m);in(w); for (int i=1;i<=w;i++) in(s[i].x),in(s[i].y),sta[++cnt]=s[i].x,sta[++cnt]=s[i].y; sort(sta+1,sta+cnt+1);cnt=unique(sta+1,sta+cnt+1)-sta; for (int i=1;i<=w;i++) s[i].x=lower_bound(sta+1,sta+cnt+1,s[i].x)-sta, s[i].y=lower_bound(sta+1,sta+cnt+1,s[i].y)-sta, cntx[s[i].x]++,cnty[s[i].y]++; in(k);cnt=0;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-1]+C[i-1][j])%=P; } sort(s+1,s+w+1); for (int i=1;i<=w;i++) { if (i>1&&s[i].y==s[i-1].y) cnt++,(ans+=(query(s[i].x-1)-query(s[i-1].x))*C[cnt][k]*C[cnty[s[i].y]-cnt][k])%=P; else cnt=0; now[s[i].x]++; LL t=C[now[s[i].x]][k]*C[cntx[s[i].x]-now[s[i].x]][k]-C[now[s[i].x]-1][k]*C[cntx[s[i].x]-now[s[i].x]+1][k]; t%=P;add(s[i].x,t); } (ans+=P)%=P;cout<<ans<<endl;}
- BZOJ1227: [SDOI2009]虔诚的墓主人
- 【SDOI2009】【BZOJ1227】虔诚的墓主人
- [BZOJ1227][SDOI2009]虔诚的墓主人
- 【SDOI2009】bzoj1227 虔诚的墓主人
- bzoj1227[SDOI2009]虔诚的墓主人
- bzoj1227: [SDOI2009]虔诚的墓主人
- bzoj1227 [SDOI2009]虔诚的墓主人
- BZOJ1227: [SDOI2009]虔诚的墓主人
- [BZOJ1227][SDOI2009]虔诚的墓主人
- 【BZOJ1227】【SDOI2009】虔诚的墓主人
- 【bzoj1227】【SDOI2009】【虔诚的墓主人】【组合数学+树状数组】
- [杂题 离散 扫描线] BZOJ1227: [SDOI2009]虔诚的墓主人
- [SDOI2009]虔诚的墓主人
- bzoj1227 虔诚的墓主人 树状数组
- bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)
- 【BZOJ 1227】 [SDOI2009]虔诚的墓主人
- bzoj 1227: [SDOI2009]虔诚的墓主人
- bzoj 1227: [SDOI2009]虔诚的墓主人
- utilities(C++)——Null类的设计
- 缓存
- iOS Provisioning Profile(Certificate)与Code Signing详解
- Apache2.4.9 多域名多网站配置
- Docker Java+Tomcat 环境搭建
- 【SDOI2009】【BZOJ1227】虔诚的墓主人
- hdu 1150 Machine Schedule(求最小点覆盖)
- 代码检测工具(三)INTELLIJ IDEA集成CHECKSTYLE
- [BZOJ3238][Ahoi2013]差异 做题笔记
- 数据流分析(一)
- LA 5059 NIM游戏
- 在 Ubuntu 14.04 下安装 mysql 5.7.10
- Android最佳性能实践(三)——高性能编码优化
- MySQL怎样存储IP地址