hdu2642二维树状数组单点更新+区间查询
http://acm.hdu.edu.cn/showproblem.php?pid=2642
题目大意:一个星空,二维的.上面有1000*1000的格点,每个格点上有星星在闪烁.一开始时星星全部暗淡着,有Q个操作:
B x y 点亮一盏星星
D x y 熄灭一盏星星
Q fx tx fy ty 查询这个矩形里面亮着的星星的个数.
题解:首先,注意输入的x,y可能是(0,0),这样一来,用树状数组就不好维护了,所以将之平移一个单位,每当读入一对坐标,要进行x++,y++..
其次,输入的查询,矩形的fx,tx大小未定,所以用:if(fx>tx)swap(fx,tx);进行判断一下
最后,星星点亮了可能还会再次点亮,所以需要加上一个状态数组进行判断.
#include<iostream> #include<math.h> #include<algorithm> #include<stdlib.h> #include<time.h> using namespace std; #define ll long long #define re(i,n) for(int i=0;i<n;i++) const int maxn = 1007; int a[maxn][maxn]; bool sta[maxn][maxn]; int lowbit(int x){ return x&-x; } void update(int x, int y, int d){ for (int i = x; i < maxn; i+=lowbit(i)){ for (int j = y; j < maxn; j+=lowbit(j)){ a[i][j] += d; } } } int query(int x, int y){ int ans = 0; for (int i = x; i>0; i -= lowbit(i)){ for (int j = y; j>0; j -= lowbit(j)){ ans += a[i][j]; } } return ans; } int main(){ freopen("in.txt", "r", stdin); int q; cin >> q; memset(a, 0, sizeof(a)), memset(sta, 0, sizeof(sta)); while (q--){ char op[2]; scanf("%s", op); if (op[0] == 'Q'){ int fx, fy, tx, ty; scanf("%d%d%d%d", &fx, &tx, &fy, &ty); fx++, fy++, tx++, ty++; if (fx>tx)swap(fx, tx); if (fy > ty)swap(fy, ty); fx--, fy--; int ans = query(tx, ty) + query(fx, fy) - query(tx, fy) - query(fx, ty); printf("%d\n", ans); } else{ int x, y; scanf("%d%d", &x, &y); x++, y++; if (op[0] == 'B'){ if (sta[x][y])continue; update(x, y, 1), sta[x][y] = 1; } else{ if (sta[x][y] == false)continue; update(x, y, -1), sta[x][y] = 0; } } } return 0; }
hdu2642二维树状数组单点更新+区间查询的更多相关文章
- hdu 2642二维树状数组 单点更新区间查询 模板题
二维树状数组 单点更新区间查询 模板 从零开始借鉴http://www.2cto.com/kf/201307/227488.html #include<stdio.h> #include& ...
- TZOJ 2725 See you~(二维树状数组单点更新区间查询)
描述 Now I am leaving hust acm. In the past two and half years, I learned so many knowledge about Algo ...
- hdu 2642 二维树状数组 单点更新区间查询 模板水题
Stars Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others) Total Subm ...
- hdu2642二维树状数组单点更新
碰到这种题一定要注意坐标是不是有序的,也要注意坐标是不是有0的,有的话需要+1处理 #include<bits/stdc++.h> using namespace std; #define ...
- 【2018年全国多校算法寒假训练营练习比赛(第五场)-E】情人节的电灯泡(二维树状数组单点更新+区间查询)
试题链接:https://www.nowcoder.com/acm/contest/77/E 题目描述 情人节到了,小芳和小明手牵手,打算过一个完美的情人节,但是小刚偏偏也来了,当了一个明晃晃的电灯泡 ...
- SPOJ - MATSUM 二维树状数组单点更新
忘记了单点更新时要在树状数组中减去原值..wa了一发 /* 矩形求和,单点更改 */ #include<iostream> #include<cstring> #include ...
- 牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?
开心.jpg J.farm 先解释一下题意,题意就是一个n*m的矩形区域,每个点代表一个植物,然后不同的植物对应不同的适合的肥料k,如果植物被撒上不适合的肥料就会死掉.然后题目将每个点适合的肥料种类( ...
- 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询
题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...
- 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...
随机推荐
- Linux文件I/O
文件描述符(File Descriptor) a small, nonnegative integer for use in subsequent system calls (read(2), wri ...
- su认证失败&文件夹里打开终端的方法&atom安装
很久没用笔记本上的ubuntu,用不顺手,比在公司调教了半年多的电脑差远了.一步一步来.先解决最不顺手的三件事 1.su认证失败. 新安装的ubuntu系统是无法切换到root账户的,得做一番修改 s ...
- https协议了解,以及相关协议的解析
HTTPS简介 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版. ...
- linux线程同步(1)-互斥量
一.概述 互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行 ...
- Centos下mysql数据库备份与恢复的方法
一.mysqldump工具备份 mysqldump由于是mysql自带的备份工具,所以也是最常用的mysql数据库的备份工具.支持基于InnoDB的热备份.但由于是逻辑备份,所以速度不是很快,适合备份 ...
- CentOS下mysql默认安装位置
如果采用RPM包安装,安装路径应在/usr/share/mysql目录下 mysqldump文件位置:/usr/bin/mysqldump mysqli配置文件: /etc/my.cnf或/usr/s ...
- 谁在死锁Mutex——用Windbg查找Mutex死锁所有者线程
Who is blocking that Mutex? - Fun with WinDbg, CDB and KD 05 Aug 2006 By Ingo Rammer I'm currently t ...
- [转]simple sample to create and use widget for nopcommerce
本文转自:http://badpaybad.info/simple-sample-to-create-and-use-widget-for-nopcommerce Here is very simpl ...
- 【CSS】使用边框和背景
1. 应用边框样式 先从控制边框样式的属性开始.简单边框有三个关键属性:border-width.border-style 和 border-color . <!DOCTYPE html> ...
- XML操作类
using System; using System.Data; using System.IO; using System.Xml; namespace DotNet.Utilities { ...