Mobile Phone(二维树状数组)

本文介绍了一个关于二维树状数组的经典问题,通过一个具体的例子详细解释了如何实现二维树状数组的更新和查询操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mobile Phone

My Tags  (Edit)
Source : IOI 2001
Time limit : 5 secMemory limit : 32 M

Submitted : 1040, Accepted : 310

PROBLEM

 

Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The area is divided into squares. The squares form an S´S matrix with the rows and columns numbered from 0 to S-1. Each square contains a base station. The number of active mobile phones inside a square can change because a phone is moved from a square to another or a phone is switched on or off. At times, each base station reports the change in the number of active phones to the main base station along with the row and the column of the matrix.

 

Write a program, which receives these reports and answers queries about the current total number of active mobile phones in any rectangle-shaped area.

 

INPUT AND OUTPUT

 

The input is read from standard input as integers and the answers to the queries are written to standard output as integers. The input contains multiple test cases. Each test case is encoded as follows. Every instruction comes on a separate line, and consists of one instruction id and a number of parameter integers according to the following table.

 

Instruction

Parameters

Meaning

0

S

Initialize the matrix size to S´S containing all zeros. This instruction is given only once and it will be the first instruction.

1

X Y A

Add A to the number of active phones in table square (XY). Amay be positive or negative.

2

L B R T

Query the current sum of numbers of active mobile phones  in squares (X,Y), where L £ X £ RB £ Y £ T

3

 

Terminate program. This instruction is given only once and it will be the last instruction.

 

The values will always be in range, so there is no need to check them. In particular, if A is negative, it can be assumed that it will not reduce the square value below zero. The indexing starts at 0, e.g. for a table of size 4´4, we have 0 £ X £ 3 and 0 £ Y £ 3.

 

Your program should not answer anything to lines with an instruction other than 2. If the instruction is 2, then your program is expected to answer the query by writing the answer as a single line containing a single integer to standard output.

 

There are multiple test cases, process to the end of file.

CONSTRAINTS

 

0  £  V  £  215 –1  (= 32767)

Table size

S*S

1´£ S´S £ 1024´1024

Cell value V at any time

V

0 £ V £ 215 –1  (= 32767)

Update amount

A

- 215 £ A £ 215–1  (= 32767)

No of instructions in input

U

£ U £ 60002

Maximum number of phones in the whole table

M

M= 230

 

Sample Input

0 41 1 2 32 0 0 2 21 1 1 21 1 2 -12 1 1 2 33

Sample Output

34

这是一个较为经典的二维树状数组的题目,其实二维相较于一维也就是处理的时候多了一维

例如一维的add函数由

	void add(int x,LL Add){
		for(int i = x; i <= S; i = i+lowbit(i)){
			c[i] += Add;
		}
	}

更新为二维的

void add(int x,int y,LL Add){
		for(int i = x; i <= S; i = i+lowbit(i)){
			for(int j = y; j <= S; j = j+lowbit(j)){
				Map[i][j] += Add;
			}
		}
	}

其他的与之类似,比如sum函数,其他的就都一样了

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int maxn = 1030;
int S,X,Y,ADD;
int X1,X2,Y1,Y2;
LL Map[maxn][maxn];
int lowbit(int x){
	return (x & -x);
}
void add(int x,int y,LL Add){
	for(int i = x; i <= S; i = i+lowbit(i)){
		for(int j = y; j <= S; j = j+lowbit(j)){
			Map[i][j] += Add;
		}
	}
}
LL sum(int x,int y){
	LL ans = 0;
	for(int i = x; i > 0; i = i-lowbit(i))
		for(int j = y; j > 0; j = j-lowbit(j)){
			ans += Map[i][j];
		}
	return ans;
}
int main(){
	int ch;
	while(~scanf("%d %d",&ch,&S)){
		memset(Map,0,sizeof(Map));
		while(scanf("%d",&ch) && ch != 3){
			if(ch == 1){
				scanf("%d %d %d",&X,&Y,&ADD);
				add(X+1,Y+1,ADD);
			}
			else{
				scanf("%d %d %d %d",&X1,&Y1,&X2,&Y2);
				printf("%lld\n",sum(X2+1,Y2+1)-sum(X1,Y2+1)-sum(X2+1,Y1)+sum(X1,Y1));
			}
		}
	}
	return 0;
}

资源下载链接为: https://pan.xunlei.com/s/VOYaHLhVeXGtGmlvno37CKcgA1?pwd=hwch 本次目标检测任务以YOLOv1模型为核心,我完整参与了数据预处理、数据集定义、模型搭建、损失函数设计及结果预测全流程,对深度学习有了更直观的认知。实践中曾因数据预处理阶段bbox的y坐标计算错误,导致后续训练模型输出大量负数,这也让我养成了模块写完即验证的习惯,不过初期验证较粗略,多以“不报错、能运行”为标准。 修正后,我用小训练集验证模型正确性,观察是否能实现过拟合,进而调整学习率等参数。此次任务不仅让我掌握了目标检测基本流程与YOLOv1核心思路,还熟练运用PyTorch完成数据处理、网络构建及矩阵运算,更激发了学习《深度学习》的兴趣。同时我也发现YOLOv1的不足:数据编码时,单个网格若存在多个物体仅保留一个,会造成数据丢失,因此不适用于预测框较多的场景。 训练中还积累了实用经验:在华为云训练时,将数据移至./cache可减少与OBS桶的交互,避免图片读取过慢;云端计算损失需用train_loss += loss.item(),否则内存会持续占用直至Notebook停止(本地训练无此问题);需关注云端磁盘空间,曾因空间不足导致三小时训练后模型保存失败;建议将每张图片对应的bbox提前整合到txt文件中,此前将bbox暂存内存,每次整合需5分钟,若调试时遇“CUDA out of memory”重启,需重新整合,既耗时又不利于代码检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值