牛客网暑期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 ...
随机推荐
- 相亲神器记录Swift1.2
这个简单APP是用swfit1.2写的,主要重点是:1.点击键盘return键可退出键盘. 2.各个控件值的传递. Storyboard界面设计: View代码: import UIKit class ...
- Hbase shell 输入无法使用退格键删除解决办法
今天在进入hbase shell终端进行数据查询和添加时,发现输入的命令无法撤回,现将解决办法写下: 1.使用Ctrl + Backspace或Shift + Backspace组合键删除 2.(Se ...
- Sqlite 快速批量插入数据 测试
public static int insertDbBatch() { string sql = ""; SQLiteConnection conn = new SQLiteCon ...
- 20155217《网络对抗》Exp07 网络欺诈防范
20155217<网络对抗>Exp07 网络欺诈防范 实践内容 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术,用DNS spoof引导特定访问到冒 ...
- 20155334 《网络攻防》Exp5 MSF基础应用
一.基础问题回答 解释exploit,payload,encode是什么: 项目 作用 exploit 是负载有用代码的交通工具,让代码到达目的地,并作用 payload 是有具体功能的代码,能够完成 ...
- python 回溯法 子集树模板 系列 —— 17、找零问题
问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元,要求硬币的个数最少,应该如何找零?或者指出该问题无解. 分析 元素--状态空间分析大法:四种面 ...
- R绘图 第九篇:绘制散点图和气泡图(ggplot2)
绘制散点图(scatterplots)使用geom_point()函数,气泡图(bubblechart)也是一个散点图,只不过点的大小由一个变量(size)来控制.散点图潜在的最大问题是过度绘图:当一 ...
- MVC5.0知识点梳理
我们在使用MVC的时候或许总是在使用着自己一直熟悉的知识点去实现已有的功能,多梳理一些知识点让每种功能的实现方式可以多样化. 我们在开发小型系统时总是使用微软MVC的脚手架功能,比如路由可能就是使用了 ...
- Kaggle: Google Analytics Customer Revenue Prediction EDA
前言 内容提要 本文为Kaggle竞赛 Google Analytics Customer Revenue Prediction 的探索性分析 题目要求根据历史顾客访问GStore的数据,预测其中部分 ...
- 记录Appium-desktop踩过的坑could not find devices
最近了解到一个自动化入门的新工具appium-desktop,看网上各种文章,感觉这个工具是很简单的一个入门级工具,下载试用了一下. 官网下载,输入网址appium.io,点击下载. 一路傻瓜式安装, ...