传送门

Solution

显然每个点的权值可以由当前点上下左右的树的数量用组合数\(O(1)\)求出,但这样枚举会T

那么我们考虑一段连续区间,对于一行中两个常青树中间的部分左右树的数量一定,我们可用树状数组求区上下贡献值和,相乘就得到了当前区间的贡献。

有思路调不出来系列

Code

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <iostream>
  6. #include <algorithm>
  7. #define Re register
  8. #define Ms(a,b) memset(a,(b),sizeof(a))
  9. #define Fo(i,a,b) for(Re int i=(a),_=(b);i<=_;i++)
  10. #define Ro(i,a,b) for(Re int i=(b),_=(a);i>=_;i--)
  11. using namespace std;
  12. typedef long long LL;
  13. inline int read() {
  14. int x=0,f=1;char c=getchar();
  15. while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
  16. while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
  17. return x*f;
  18. }
  19. const int MAXW=1e5+5;
  20. int n,m,W,lx,k,N;
  21. int dx[MAXW],wx[MAXW],d[MAXW],l[MAXW],u[MAXW],r[MAXW];
  22. LL ans,Cc[MAXW][13];
  23. struct Tree{int x,y,id;}T[MAXW];
  24. struct BIT{
  25. LL da[MAXW];
  26. BIT() {clear();}
  27. void clear() {Ms(da,0);}
  28. void add(int x,LL d) {for(;x<=lx;x+=x&-x)da[x]+=d;}
  29. LL qry(int x) {LL t=0;for(;x;x-=x&-x)t+=da[x];return t;}
  30. }B;
  31. bool cmpx(Tree a,Tree b) {return a.x==b.x?a.y<b.y:a.x<b.x;}
  32. bool cmpy(Tree a,Tree b) {return a.y==b.y?a.x<b.x:a.y<b.y;}
  33. void init() {
  34. sort(T+1,T+1+W,cmpx);
  35. Fo(i,1,W) {
  36. int j=i,now=0;
  37. while(T[j+1].x==T[j].x) j++,d[T[j].id]=++now;
  38. while(i<=j) u[T[i].id]=now--,i++; i--;
  39. N=max(N,d[T[j].id]);
  40. }
  41. sort(T+1,T+1+W,cmpy);
  42. Fo(i,1,W) {
  43. int j=i,now=0;
  44. while(T[j+1].y==T[j].y) j++,l[T[j].id]=++now;
  45. while(i<=j) r[T[i].id]=now--,i++; i--;
  46. N=max(N,l[T[j].id]);
  47. }
  48. Fo(i,0,N) Cc[i][0]=Cc[i][i]=1;
  49. Fo(i,2,N) Fo(j,1,k) Cc[i][j]=Cc[i-1][j]+Cc[i-1][j-1];
  50. sort(dx+1,dx+1+lx); lx=unique(dx+1,dx+1+lx)-dx-1;
  51. Fo(i,1,W) wx[i]=lower_bound(dx+1,dx+1+lx,T[i].x)-dx;
  52. }
  53. LL C(int x) {return Cc[x][k];}
  54. int main() {
  55. n=read()+1; m=read()+1; W=read();
  56. Fo(i,1,W) dx[++lx]=T[i].x=read()+1,T[i].y=read()+1,T[i].id=i;
  57. k=read(); init();
  58. for(Re int i=1,j;i<=W;i=j+1) {
  59. j=i; B.add(wx[i],C(d[T[i].id]+1)*C(u[T[i].id])-C(d[T[i].id])*C(u[T[i].id]+1));
  60. while(T[j+1].y==T[i].y) {
  61. j++; ans+=C(l[T[j-1].id]+1)*C(r[T[j].id]+1)*(B.qry(wx[j]-1)-B.qry(wx[j-1]));
  62. B.add(wx[j],C(d[T[j].id]+1)*C(u[T[j].id])-C(d[T[j].id])*C(u[T[j].id]+1));
  63. }
  64. }
  65. printf("%d",ans&2147483647);//自然溢出,可以有效简化代码,但易出错,慎用
  66. return 0;
  67. }

[luogu2154 SDOI2009] 虔诚的墓主人(树状数组+组合数)的更多相关文章

  1. Bzoj 1227: [SDOI2009]虔诚的墓主人 树状数组,离散化,组合数学

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec  Memory Limit: 259 MBSubmit: 895  Solved: 422[Submit][Statu ...

  2. P2154 [SDOI2009]虔诚的墓主人 树状数组

    https://www.luogu.org/problemnew/show/P2154 题意 在一个坐标系中,有w(1e5)个点,这个图中空点的权值是正上,正下,正左,正右各取k个的排列组合情况.计算 ...

  3. BZOJ-1227 虔诚的墓主人 树状数组+离散化+组合数学

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MB Submit: 914 Solved: 431 [Submit][Statu ...

  4. BZOJ1227 SDOI2009 虔诚的墓主人【树状数组+组合数】【好题】*

    BZOJ1227 SDOI2009 虔诚的墓主人 Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. ...

  5. luogu2154 [SDOI2009] 虔诚的墓主人 离散化 树状数组 扫描线

    题目大意 公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.一块墓地的虔诚度是指以这块墓地为中心的十字架的数目,一个十字架可以看成中间是墓地,墓地的正上.正 ...

  6. [BZOJ1227][SDOI2009]虔诚的墓主人 组合数+树状数组

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec  Memory Limit: 259 MBSubmit: 1433  Solved: 672[Submit][Stat ...

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

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

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

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

  9. BZOJ 1227 虔诚的墓主人(离散化+树状数组)

    题目中矩形的尺寸太大,导致墓地的数目太多,如果我们统计每一个墓地的虔诚度,超时是一定的. 而常青树的数目<=1e5.这启发我们从树的方向去思考. 考虑一行没有树的情况,显然这一行的墓地的虔诚度之 ...

随机推荐

  1. Codeforces Round #316 (Div. 2) C. Replacement(线段树)

    C. Replacement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  2. LeetCode 359. Logger Rate Limiter (记录速率限制器)$

    Design a logger system that receive stream of messages along with its timestamps, each message shoul ...

  3. Spark SQL Catalyst源代码分析之UDF

    /** Spark SQL源代码分析系列文章*/ 在SQL的世界里,除了官方提供的经常使用的处理函数之外.一般都会提供可扩展的对外自己定义函数接口,这已经成为一种事实的标准. 在前面Spark SQL ...

  4. CodeForces 16B Burglar and Matches(贪心)

    B. Burglar and Matches time limit per test 0.5 second memory limit per test 64 megabytes input stand ...

  5. Eclipse下单个文件中文乱码问题

    有时候用eclipse打开单个文件,会出现中文乱码问题. 这时可以点菜单栏 Edit -> Set Encoding,Other:UTF-8,通常可以解决问题.

  6. YTU 2720: 删出多余的空格

    2720: 删出多余的空格 时间限制: 1 Sec  内存限制: 128 MB 提交: 338  解决: 201 题目描述 小平在给弟弟检查英语作业时时,发现每个英语句子单词之间的空格个数不等,请你编 ...

  7. git ldap

    https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md ldap : enabled : true host : 'ope ...

  8. Linux必知必会的目录结构

    1.目录结构 /bin 二进制文件 命令 /sbin 超级命令 只有root用户可以使用 /boot 系统的引导文件 系统内核 /dev 设备文件 光盘 硬盘分区 /etc 系统配置文件 /home ...

  9. 设计模式 | 适配器模式(adapter)

    定义: 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.   书中说到Gof的设计模式中,讲了两种类型的适配器模式: 1.类适配 ...

  10. hihocode 编程练习赛17

    1. f1 score 首先了解f1 score的计算方法, 我记得是学信息检索知道的, 然后简单处理就行. 由于我写的比较麻烦, 中间处理过程引入了一些除数为0的情况,导致错了很多次.其实是很简单的 ...