牛客网暑期ACM多校训练营(第二场)J farm (二维树状数组)
题目链接:
https://www.nowcoder.com/acm/contest/140/J
思路:
都写在代码注释里了,非常好懂。。
for_each函数可以去看一下,遍历起vector数组比较方便,用for(int i = 0;i < q[i].size();i++)的话,是会有一些弊端的,虽然对于这道题应该没什么影响,但最好规范下。
耗时:2072ms
实现代码:
- #include<bits/stdc++.h>
- using namespace std;
- const int M = 1e6+;
- vector<int>t[M];
- int n,m;
- vector<int>bit[M];
- int lowbit(int x){
- return x&-x;
- }
- struct node{
- int a,b,c,d;
- node(){}
- node(int a1,int b1,int c1,int d1):a(a1),b(b1),c(c1),d(d1){}
- };
- struct node1{
- int i,j;
- node1(){}
- node1(int i1,int j1):i(i1),j(j1){}
- };
- vector<node1>k[M];
- vector<node>q[M];
- void add(int x,int y,int z){
- for(int i=x;i<=n;i+=lowbit(i)){
- for(int j=y;j<=m;j+=lowbit(j))
- bit[i][j]+=z;
- }
- }
- void update(int x1,int y1,int x2,int y2,int z){
- add(x1,y1,z);
- add(x2+,y2+,z);
- add(x1,y2+,-z);
- add(x2+,y1,-z);
- }
- int sum(int x,int y){
- int res=;
- for(int i=x;i;i-=lowbit(i)){
- for(int j=y;j;j-=lowbit(j)){
- res+=bit[i][j];
- }
- }
- return res;
- }
- template <class T>
- inline void scan_d(T &ret)
- {
- char c;
- ret = ;
- while ((c = getchar()) < '' || c > '');
- while (c >= '' && c <= '')
- {
- ret = ret * + (c - ''), c = getchar();
- }
- }
- template <class T>
- inline void print_d(T x)
- {
- if (x > )
- {
- print_d(x / );
- }
- putchar(x % + '');
- }
- void fun1(node now){
- update(now.a,now.b,now.c,now.d,);
- }
- void fun2(node now){
- update(now.a,now.b,now.c,now.d,-);
- }
- int num;
- void fun3(node1 now){
- if(sum(now.i,now.j)) num++;
- }
- int main()
- {
- int t,x,a,b,c,d,z;
- scan_d(n); scan_d(m); scan_d(t);
- for(int i = ;i <= n;i ++) bit[i].resize(m+); //预开空间
- for(int i = ;i <= n;i ++) {
- for(int j = ;j <= m;j ++){
- scan_d(x);
- k[x].push_back(node1(i,j)); //需要x种类药的花的坐标
- }
- }
- for(int i = ;i <= t;i ++){
- scan_d(a);scan_d(b),scan_d(c),scan_d(d);scan_d(z);
- update(a,b,c,d,); //标记代表这个区间被z种类药撒了
- q[z].push_back(node(a,b,c,d)); //存下z种类药一共撒了哪些区间
- }
- num = ;
- for(int i = ;i <= n*m;i ++){ //遍历所有种类的药
- if(k[i].size()){ //存在需要ki种类药的花
- for_each(q[i].begin(),q[i].end(),fun2); //将ki种类药撒的区间造成的影响全部清0
- for_each(k[i].begin(),k[i].end(),fun3); //遍历需要k种类药的所有花的坐标如果这个坐标依旧为1,那么代表撒在它上面的并不是k种类的药,这朵花会死亡,num++;
- for_each(q[i].begin(),q[i].end(),fun1); //再将ki种类药撒的区间还原
- }
- }
- print_d(num);
- printf("\n");
- return ;
- }
牛客网暑期ACM多校训练营(第二场)J farm (二维树状数组)的更多相关文章
- 牛客网暑期ACM多校训练营 第九场
HPrefix Sum study from : https://blog.csdn.net/mitsuha_/article/details/81774727 k较小.分离x和k. 另外的可能:求a ...
- 牛客网暑期ACM多校训练营(第四场):A Ternary String(欧拉降幂)
链接:牛客网暑期ACM多校训练营(第四场):A Ternary String 题意:给出一段数列 s,只包含 0.1.2 三种数.每秒在每个 2 后面会插入一个 1 ,每个 1 后面会插入一个 0,之 ...
- 牛客网暑期ACM多校训练营(第五场):F - take
链接:牛客网暑期ACM多校训练营(第五场):F - take 题意: Kanade有n个盒子,第i个盒子有p [i]概率有一个d [i]大小的钻石. 起初,Kanade有一颗0号钻石.她将从第1到第n ...
- 牛客网 暑期ACM多校训练营(第二场)A.run-动态规划 or 递推?
牛客网暑期ACM多校训练营(第二场) 水博客. A.run 题意就是一个人一秒可以走1步或者跑K步,不能连续跑2秒,他从0开始移动,移动到[L,R]的某一点就可以结束.问一共有多少种移动的方式. 个人 ...
- 牛客网 暑期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 ,问你 ...
- 牛客网暑期ACM多校训练营(第三场)H Diff-prime Pairs (贡献)
牛客网暑期ACM多校训练营(第三场)H Diff-prime Pairs (贡献) 链接:https://ac.nowcoder.com/acm/contest/141/H来源:牛客网 Eddy ha ...
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
- 牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?
开心.jpg J.farm 先解释一下题意,题意就是一个n*m的矩形区域,每个点代表一个植物,然后不同的植物对应不同的适合的肥料k,如果植物被撒上不适合的肥料就会死掉.然后题目将每个点适合的肥料种类( ...
- 牛客网暑期ACM多校训练营(第七场)Bit Compression
链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 题目描述 A binary string s of length N = 2n is give ...
随机推荐
- 删除方法odoo
##判断删除情况,不允许删除def unlink(self,cr,uid,ids,context=None): raise osv.except_osv(u'警告!',u'单据不允许删除' ...
- c# speech 文本转语言
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- mfc 类型间的强制转换
一. static_cast运算符 用法:static_cast < type-id > ( expression ) 该运算符把expression 转换为type-id类型,但没有运行 ...
- Maven学习第1期---Maven简单介绍
前言 Hadoop的MapReduce环境是一个复杂的编程环境,所以我们要尽可能地简化构建MapReduce项目的过程.Maven是一个很不错的自动化项目构建工具,通过Maven来帮助我们从复杂的环境 ...
- libgdx学习记录25——Rectangle与Circle是否重叠
Rect与Circle重叠有三种情况: 1. Rect至少有一个角在Circle里面 2. Circle与Rect的左边或右边相交,或者Circle在Rect内 3. Circle与Rect的顶边或底 ...
- mongodb安装教程
MongoDB 下载及安装 MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www. ...
- 【中间件】Redis 实战之主从复制、高可用、分布式
目录 简介 持久化 主从复制 高可用 Redis-Sentinel .NET Core开发 分布式 Redis-Cluster 配置说明 常见问题 简介 本节内容基于 CentOS 7.4.1708, ...
- 在Microsoft Dynamic 365/2016环境使用LinqPad查询数据(不使用linqpad Microsoft Dynamic 365 Driver)
在Microsoft Dynamic 365/2016环境使用LinqPad查询数据 老规矩,先上效果图: 实体集合: 实体属性: 属性值: 查询出的结果可以导出的格式: 操作步骤: 1.下载Lin ...
- linux下SpringBoot Jar包自启脚本配置
今天整理服务器上SpringBoot项目发现是自启的,于是想看看实现.翻看离职同事的交接文档发现一个***.service文件内容如下 [Unit] Description=sgfront After ...
- 关于sql server2008数据库的连接的几个问题及解决办法
写在开头 不得不说给一台新的服务器配置和部署的确是个不小的工程,在这里先感谢我们的DEV焉域政同学在这方面做出的一些贡献:把安装过程极为困难的sql server2008成功安装到服务器上,并且为我们 ...