题意是给了 n个二元组 m个三元组, 二元组可以和三元组 合并生成3元组,合并条件是<a,b> 与<c,d,e>合并成 <a,c,d> 前提是 b==e,

如果存在组合 uwv 使得u>=a w>=c v>=d 并且uwv和acd不等  就说abc 不是最优的,求问最后又多少个组合是最优的 , 这个组合中是允许重复的

我们对于每个b只取最大的a,然后让这个最大的a去和相应的b,c进行组合,然后对于这样的三元组 为了省去判断和他相等的个数,我们直接将相同的元组合并到一起去,

然后枚举a求在 在矩阵C[b][c]右下边是否存在值如果存在显然这个就不是最优的,用二维树状数组解决这个问题

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <vector>
  5. #include <string.h>
  6. using namespace std;
  7. const int maxn=;
  8. struct point{
  9. int a,c,d,nu;
  10. bool operator <(const point &rhs)const{
  11. if(a!=rhs.a)return a<rhs.a;
  12. if(c!=rhs.c)return c<rhs.c;
  13. return d<rhs.d;
  14. }
  15. bool operator ==(const point &rhs)const{
  16. return a==rhs.a&&c==rhs.c&&d==rhs.d;
  17. }
  18. }P[maxn];
  19. int B[maxn];
  20. int nu[maxn];
  21. int C[][];
  22. int Nc,Nd,numofC;
  23. void init()
  24. {
  25. numofC=Nc=Nd=;
  26. memset(B,,sizeof(B));
  27. memset(nu,,sizeof(nu));
  28. memset(C,,sizeof(C));
  29. }
  30. int lowbit(int x)
  31. {
  32. return x&(-x);
  33. }
  34. void add(int c,int d,int val)
  35. {
  36. for(int i=c; i<=Nc; i+=lowbit(i))
  37. for(int j=d; j<=Nd; j+=lowbit(j))
  38. C[i][j]+=val;
  39. }
  40. int sum(int c, int d)
  41. {
  42. int ans=;
  43. for(int i=c; i>; i-=lowbit(i))
  44. for(int j=d; j>; j-=lowbit(j))
  45. ans+=C[i][j];
  46. return ans;
  47. }
  48. int main()
  49. {
  50. int cas;
  51. scanf("%d",&cas);
  52. for(int cc=; cc<=cas; cc++)
  53. {
  54. int n,m;
  55. scanf("%d%d",&n,&m);
  56. init();
  57. for(int i=; i<n; i++)
  58. {
  59. int a,b;
  60. scanf("%d%d",&a,&b);
  61. if(B[b]<a){ B[b]=a; nu[b]=;}
  62. else if(B[b]==a) nu[b]++;
  63. }
  64. for(int i=; i<m; i++)
  65. {
  66. int c,d,e;
  67. scanf("%d%d%d",&c,&d,&e);
  68. if(nu[e]>)
  69. {
  70. point t;
  71. t.a=B[e]; t.c=c; t.d=d; t.nu=nu[e];
  72. P[numofC++]=t;
  73. }
  74. Nc=max(c,Nc); Nd=max(Nd,d);
  75. }
  76. sort(P,P+numofC);
  77. int ge=;
  78. for(int i=; i<numofC; i++)
  79. if(P[i]==P[ge-])P[ge-].nu+=P[i].nu;
  80. else P[ge++]=P[i];
  81. numofC=ge;
  82. int ans=;
  83. ge=;
  84. for(int i=numofC-; i>=; i--)
  85. {
  86. point t=P[i];
  87. int s2=sum(t.c-,Nd);
  88. int s3=sum(Nc,t.d-);
  89. int s4=sum(t.c-,t.d-);
  90. if(ge-s2-s3+s4 == ){
  91. ans+=t.nu;
  92. }
  93. ge++;
  94. add(t.c,t.d,);
  95. }
  96. printf("Case #%d: %d\n",cc,ans);
  97.  
  98. }
  99. return ;
  100. }

hdu5517 二维树状数组的更多相关文章

  1. 二维树状数组 BZOJ 1452 [JSOI2009]Count

    题目链接 裸二维树状数组 #include <bits/stdc++.h> const int N = 305; struct BIT_2D { int c[105][N][N], n, ...

  2. HDU1559 最大子矩阵 (二维树状数组)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1559 最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)  ...

  3. POJMatrix(二维树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 22058   Accepted: 8219 Descripti ...

  4. poj 1195:Mobile phones(二维树状数组,矩阵求和)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14489   Accepted: 6735 De ...

  5. Codeforces Round #198 (Div. 1) D. Iahub and Xors 二维树状数组*

    D. Iahub and Xors   Iahub does not like background stories, so he'll tell you exactly what this prob ...

  6. POJ 2155 Matrix(二维树状数组+区间更新单点求和)

    题意:给你一个n*n的全0矩阵,每次有两个操作: C x1 y1 x2 y2:将(x1,y1)到(x2,y2)的矩阵全部值求反 Q x y:求出(x,y)位置的值 树状数组标准是求单点更新区间求和,但 ...

  7. [poj2155]Matrix(二维树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 25004   Accepted: 9261 Descripti ...

  8. POJ 2155 Matrix (二维树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17224   Accepted: 6460 Descripti ...

  9. [POJ2155]Matrix(二维树状数组)

    题目:http://poj.org/problem?id=2155 中文题意: 给你一个初始全部为0的n*n矩阵,有如下操作 1.C x1 y1 x2 y2 把矩形(x1,y1,x2,y2)上的数全部 ...

随机推荐

  1. (原)ffmpeg过滤器开发和理解

    最近学习了ffmpeg关于filter过滤器的开发,关于中间的几个相关概念,我们先放在简单介绍一下: AVFilterGraph:几乎完全等同与directShow中的fitlerGraph,代表一串 ...

  2. Web重温系列(三):OracleDependency实现监听数据库变化

    有个小项目(后来由另一个小组以Java开发了),内容是监控一个Oracle数据库.如果其中一个表A有数据变动,则需要将相关内容重组后通过接口发送给B. 通常的解决办法是定时查询,时间间隔可以小一点,还 ...

  3. php.ini 开发和线上配置的差异

    比对了一下php自带的php.ini-development和php.ini-production,备忘. display_errors = Ondisplay_startup_errors = On ...

  4. Zephyr学习(五)线程和调度

    前面说过zephyr支持静态和动态两种方式创建线程,这里分析动态创建的方式.应用程序通过调用k_thread_create()函数创建一个线程,实际上是调用_impl_k_thread_create( ...

  5. 如何在spring-boot web项目中启用swagger

    swagger的三个项目及其作用 我们打开swagger的官网,会发现有三个swagger相关的项目,它们分别是 swagger-editor 作用是通过写代码,生成文档描述(一个json文件或其他格 ...

  6. VS Code设置成中文界面

    1.打开VS Code,按:ctrl+shift+p打开指令面板,输入lang,选择Configure Display Language 2.将"locale"后面的"e ...

  7. python2.7环境下的flask项目导入模块失败解决办法

    如下一个flask项目的目录: 这个flask项目在python3.6环境下可以正常启动,但是在python2.7环境下如下报错提示: 提醒模块找不到.如下解决方法: 只需要在views目录里面加一个 ...

  8. share drive 无效

    docker设置的share dirve怎么按都无效 试了几遍都不行,想想刚才电脑系统更新了,然后查了下百度,发现是电脑策略的问题,设置成经典的就可以了

  9. js 读秒

    <input type="button" value=" 获取验证码 " class="verification right" &qu ...

  10. 阿里云 ECS 迁移到七牛 QVM 记

    操作 下载脚本 curl -O http://p70nwjoid.bkt.clouddn.com/go2qvm_client1.5_linux_x86_64.zip 解压填写配置 unzip go2q ...