题目链接:

https://www.nowcoder.com/acm/contest/140/J

思路:

都写在代码注释里了,非常好懂。。

for_each函数可以去看一下,遍历起vector数组比较方便,用for(int i = 0;i < q[i].size();i++)的话,是会有一些弊端的,虽然对于这道题应该没什么影响,但最好规范下。

耗时:2072ms

实现代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int M = 1e6+;
  4. vector<int>t[M];
  5. int n,m;
  6. vector<int>bit[M];
  7. int lowbit(int x){
  8. return x&-x;
  9. }
  10.  
  11. struct node{
  12. int a,b,c,d;
  13. node(){}
  14. node(int a1,int b1,int c1,int d1):a(a1),b(b1),c(c1),d(d1){}
  15. };
  16.  
  17. struct node1{
  18. int i,j;
  19. node1(){}
  20. node1(int i1,int j1):i(i1),j(j1){}
  21. };
  22.  
  23. vector<node1>k[M];
  24. vector<node>q[M];
  25.  
  26. void add(int x,int y,int z){
  27. for(int i=x;i<=n;i+=lowbit(i)){
  28. for(int j=y;j<=m;j+=lowbit(j))
  29. bit[i][j]+=z;
  30. }
  31. }
  32. void update(int x1,int y1,int x2,int y2,int z){
  33. add(x1,y1,z);
  34. add(x2+,y2+,z);
  35. add(x1,y2+,-z);
  36. add(x2+,y1,-z);
  37. }
  38. int sum(int x,int y){
  39. int res=;
  40. for(int i=x;i;i-=lowbit(i)){
  41. for(int j=y;j;j-=lowbit(j)){
  42. res+=bit[i][j];
  43. }
  44. }
  45. return res;
  46. }
  47.  
  48. template <class T>
  49. inline void scan_d(T &ret)
  50. {
  51. char c;
  52. ret = ;
  53. while ((c = getchar()) < '' || c > '');
  54. while (c >= '' && c <= '')
  55. {
  56. ret = ret * + (c - ''), c = getchar();
  57. }
  58. }
  59.  
  60. template <class T>
  61. inline void print_d(T x)
  62. {
  63. if (x > )
  64. {
  65. print_d(x / );
  66. }
  67. putchar(x % + '');
  68. }
  69.  
  70. void fun1(node now){
  71. update(now.a,now.b,now.c,now.d,);
  72. }
  73.  
  74. void fun2(node now){
  75. update(now.a,now.b,now.c,now.d,-);
  76. }
  77.  
  78. int num;
  79. void fun3(node1 now){
  80. if(sum(now.i,now.j)) num++;
  81. }
  82.  
  83. int main()
  84. {
  85. int t,x,a,b,c,d,z;
  86. scan_d(n); scan_d(m); scan_d(t);
  87. for(int i = ;i <= n;i ++) bit[i].resize(m+); //预开空间
  88. for(int i = ;i <= n;i ++) {
  89. for(int j = ;j <= m;j ++){
  90. scan_d(x);
  91. k[x].push_back(node1(i,j)); //需要x种类药的花的坐标
  92. }
  93. }
  94. for(int i = ;i <= t;i ++){
  95. scan_d(a);scan_d(b),scan_d(c),scan_d(d);scan_d(z);
  96. update(a,b,c,d,); //标记代表这个区间被z种类药撒了
  97. q[z].push_back(node(a,b,c,d)); //存下z种类药一共撒了哪些区间
  98. }
  99. num = ;
  100. for(int i = ;i <= n*m;i ++){ //遍历所有种类的药
  101. if(k[i].size()){ //存在需要ki种类药的花
  102. for_each(q[i].begin(),q[i].end(),fun2); //将ki种类药撒的区间造成的影响全部清0
  103. for_each(k[i].begin(),k[i].end(),fun3); //遍历需要k种类药的所有花的坐标如果这个坐标依旧为1,那么代表撒在它上面的并不是k种类的药,这朵花会死亡,num++;
  104. for_each(q[i].begin(),q[i].end(),fun1); //再将ki种类药撒的区间还原
  105. }
  106. }
  107. print_d(num);
  108. printf("\n");
  109. return ;
  110. }

牛客网暑期ACM多校训练营(第二场)J farm (二维树状数组)的更多相关文章

  1. 牛客网暑期ACM多校训练营 第九场

    HPrefix Sum study from : https://blog.csdn.net/mitsuha_/article/details/81774727 k较小.分离x和k. 另外的可能:求a ...

  2. 牛客网暑期ACM多校训练营(第四场):A Ternary String(欧拉降幂)

    链接:牛客网暑期ACM多校训练营(第四场):A Ternary String 题意:给出一段数列 s,只包含 0.1.2 三种数.每秒在每个 2 后面会插入一个 1 ,每个 1 后面会插入一个 0,之 ...

  3. 牛客网暑期ACM多校训练营(第五场):F - take

    链接:牛客网暑期ACM多校训练营(第五场):F - take 题意: Kanade有n个盒子,第i个盒子有p [i]概率有一个d [i]大小的钻石. 起初,Kanade有一颗0号钻石.她将从第1到第n ...

  4. 牛客网 暑期ACM多校训练营(第二场)A.run-动态规划 or 递推?

    牛客网暑期ACM多校训练营(第二场) 水博客. A.run 题意就是一个人一秒可以走1步或者跑K步,不能连续跑2秒,他从0开始移动,移动到[L,R]的某一点就可以结束.问一共有多少种移动的方式. 个人 ...

  5. 牛客网 暑期ACM多校训练营(第一场)A.Monotonic Matrix-矩阵转化为格子路径的非降路径计数,Lindström-Gessel-Viennot引理-组合数学

    牛客网暑期ACM多校训练营(第一场) A.Monotonic Matrix 这个题就是给你一个n*m的矩阵,往里面填{0,1,2}这三种数,要求是Ai,j⩽Ai+1,j,Ai,j⩽Ai,j+1 ,问你 ...

  6. 牛客网暑期ACM多校训练营(第三场)H Diff-prime Pairs (贡献)

    牛客网暑期ACM多校训练营(第三场)H Diff-prime Pairs (贡献) 链接:https://ac.nowcoder.com/acm/contest/141/H来源:牛客网 Eddy ha ...

  7. 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)

    2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...

  8. 牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?

    开心.jpg J.farm 先解释一下题意,题意就是一个n*m的矩形区域,每个点代表一个植物,然后不同的植物对应不同的适合的肥料k,如果植物被撒上不适合的肥料就会死掉.然后题目将每个点适合的肥料种类( ...

  9. 牛客网暑期ACM多校训练营(第七场)Bit Compression

    链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 题目描述 A binary string s of length N = 2n is give ...

随机推荐

  1. 删除方法odoo

          ##判断删除情况,不允许删除def unlink(self,cr,uid,ids,context=None): raise osv.except_osv(u'警告!',u'单据不允许删除' ...

  2. c# speech 文本转语言

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  3. mfc 类型间的强制转换

    一. static_cast运算符 用法:static_cast < type-id > ( expression ) 该运算符把expression 转换为type-id类型,但没有运行 ...

  4. Maven学习第1期---Maven简单介绍

    前言 Hadoop的MapReduce环境是一个复杂的编程环境,所以我们要尽可能地简化构建MapReduce项目的过程.Maven是一个很不错的自动化项目构建工具,通过Maven来帮助我们从复杂的环境 ...

  5. libgdx学习记录25——Rectangle与Circle是否重叠

    Rect与Circle重叠有三种情况: 1. Rect至少有一个角在Circle里面 2. Circle与Rect的左边或右边相交,或者Circle在Rect内 3. Circle与Rect的顶边或底 ...

  6. mongodb安装教程

    MongoDB 下载及安装 MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www. ...

  7. 【中间件】Redis 实战之主从复制、高可用、分布式

    目录 简介 持久化 主从复制 高可用 Redis-Sentinel .NET Core开发 分布式 Redis-Cluster 配置说明 常见问题 简介 本节内容基于 CentOS 7.4.1708, ...

  8. 在Microsoft Dynamic 365/2016环境使用LinqPad查询数据(不使用linqpad Microsoft Dynamic 365 Driver)

    在Microsoft Dynamic 365/2016环境使用LinqPad查询数据 老规矩,先上效果图: 实体集合: 实体属性: 属性值:  查询出的结果可以导出的格式: 操作步骤: 1.下载Lin ...

  9. linux下SpringBoot Jar包自启脚本配置

    今天整理服务器上SpringBoot项目发现是自启的,于是想看看实现.翻看离职同事的交接文档发现一个***.service文件内容如下 [Unit] Description=sgfront After ...

  10. 关于sql server2008数据库的连接的几个问题及解决办法

    写在开头 不得不说给一台新的服务器配置和部署的确是个不小的工程,在这里先感谢我们的DEV焉域政同学在这方面做出的一些贡献:把安装过程极为困难的sql server2008成功安装到服务器上,并且为我们 ...