Tyvj1474 打鼹鼠
Description
一个大小为n(n<=1024)的正方形中。这个正方形在一个平面直角坐标系中,左下角为(0,0),右上角为(n-1,n-1)。
洞口所在的位置都是整点,就是横纵坐标都为整数的点。而SuperBrother也不时地会想知道某一个范围的鼹鼠总数
。这就是你的任务。
Input
第一行,一个数n,表示鼹鼠的范围。
以后每一行开头都有一个数m,表示不同的操作:
m=1,那么后面跟着3个数x,y,k(0<=x,y<n),表示在点(x,y)处新出现了k只鼹鼠;
m=2,那么后面跟着4个数x1,y1,x2,y2(0<=x1<=x2<n,0<=y1<=y2<n),表示询问矩形(x1,y1)-(x2,y2)内的鼹鼠数量;
m=3,表示老师来了,不能玩了。保证这个数会在输入的最后一行。
询问数不会超过10000,鼹鼠数不会超过maxlongint。
Output
Sample Input
4
1 2 2 5
2 0 0 2 3
3
Sample Output
5
乍一看这个题目,是不是很像线段树操作,欸,这个二维平面怎么线段树啊
让我们来想一想,一颗线段树维护x轴,另一颗维护y轴,
那线段树岂不是要嵌套,那外层的线段树的每一个节点都代表1个x坐标,那么每个节点都得保存一颗线段树,那颗内层的线段树就保存y坐标;
这种数据结构就叫做二维线段树
修改操作就稍微麻烦一点了
要先在外层线段树中查找x坐标,再到当前x坐标保存的y坐标的线段树中去找,进行修改
提示:外层线段树是不能进行修改的!!!
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a,b,c,d,n,m,ans;
void read(int &x) {
char ch; bool ok;
for(ok=,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=;
for(x=; isdigit(ch); x=x*+ch-'',ch=getchar()); if(ok) x=-x;
}
struct oo
{
int a,b;
struct o{int a,b,num;}y[];
void build(int now,int l,int r)
{
y[now].a=l,y[now].b=r;
if(l==r)return ;
build(now<<,l,l+r>>);
build(now<<|,(l+r>>)+,r);
}
void change(int now,int r,int num)
{
y[now].num+=num;
if(y[now].a==y[now].b)return ;
int mid=y[now].a+y[now].b>>;
if(r<=mid)change(now<<,r,num);
else change(now<<|,r,num);
}
void get(int now,int b1,int b2)
{
if(b1<=y[now].a&&b2>=y[now].b)
ans+=y[now].num;
else
{
int mid=y[now].a+y[now].b>>;
if(b1<=mid)get(now<<,b1,b2);
if(b2>mid)get(now<<|,b1,b2);
}
}
}x[];
void build(int now,int l,int r)
{
x[now].a=l,x[now].b=r;
x[now].build(,,n);
if(l==r)return ;
build(now<<,l,l+r>>);
build(now<<|,(l+r>>)+,r);
}
void change(int now,int l,int r,int num)
{
x[now].change(,r,num);
if(x[now].a==x[now].b)return ;
int mid=x[now].a+x[now].b>>;
if(l<=mid)change(now<<,l,r,num);
else change(now<<|,l,r,num);
}
void get(int now,int a1,int a2,int b1,int b2)
{
if(a1<=x[now].a&&a2>=x[now].b)
x[now].get(,b1,b2);
else
{
int mid=x[now].a+x[now].b>>;
if(a1<=mid)get(now<<,a1,a2,b1,b2);
if(a2>mid)get(now<<|,a1,a2,b1,b2);
}
}
int main()
{
read(n);
build(,,n);
while()
{
read(m);
if(m==)return ;
if(m==)
{
read(a),read(b),read(c);
change(,a,b,c);
}
if(m==)
{
read(a),read(b),read(c);read(d);
get(,a,c,b,d);
printf("%d\n",ans);
ans=;
}
}
}
Tyvj1474 打鼹鼠的更多相关文章
- BZOJ-1207 打鼹鼠 DP(LIS)
1207: [HNOI2004]打鼹鼠 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2276 Solved: 1116 [Submit][Statu ...
- BZOJ1207 [HNOI2004]打鼹鼠
Description 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢 把头探出到地面上来透透气的.根据这个特点阿Q编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格 ...
- [vijos P1512] SuperBrother打鼹鼠
这周好好码树状数组和线段树!!之前没写过二维树状数组,凭借一维的思路居然写了个比较像模像样的东西出来,原来我没那么脑残.唯一要注意的就是getsum四个矩形加减的边界条件,这里看了别人标程才意识到错误 ...
- 二维树状数组——SuperBrother打鼹鼠(Vijos1512)
树状数组(BIT)是一个查询和修改复杂度都为log(n)的数据结构,主要用于查询任意两位之间的所有元素之和,其编程简单,很容易被实现.而且可以很容易地扩展到二维.让我们来看一道很裸的二维树状数组题: ...
- BZOJ 1207 打鼹鼠
Description 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿Q编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探 ...
- [BZOJ 1207] [HNOI 2004] 打鼹鼠 【DP】
题目链接:BZOJ - 1207 题目分析 每一次打鼹鼠一定是从上一次打某只鼹鼠转移过来的,从打第 j 只鼹鼠能不能转移到打第 i 只鼹鼠,算一下曼哈顿距离和时间差就知道了. 那么就有一个 DP ,用 ...
- codevs 1256 打鼹鼠 LIS
题目链接 题目描述 Description 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的. 根据这个特点阿Q编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时 ...
- BZOJ 1207: [HNOI2004]打鼹鼠( dp )
dp.. dp[ i ] = max( dp[ j ] + 1 ) ------------------------------------------------------------------ ...
- VIJOS 1512SuperBrother打鼹鼠(二维BIT)
呵呵.. 二维树状数组,第二维和第一维基本一样. --------------------------------------------------------------------------- ...
随机推荐
- 推荐一个非常好的 IntelliJ IDEA 教程
教程地址:https://github.com/judasn/IntelliJ-IDEA-Tutorial 作者博客:http://www.youmeek.com/category/software- ...
- JAVA工厂方法模式(Factory Method)
1.普通工厂模式 普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 1-1.建立Sender接口 public interface Sender { public void ...
- webpack v3 结合 react-router v4 做 dynamic import — 按需加载(懒加载)
为什么要做dynamic import? dynamic import不知道为什么有很多叫法,什么按需加载,懒加载,Code Splitting,代码分页等.总之,就是在SPA,把JS代码分成N个页面 ...
- 有哪些逾渗模型percolation?
自wiki 1.第一个研究的模型是伯努利逾渗, 这个模型中所有键bond独立,物理学家称为键逾渗. 2.随机聚类模型,同Ising模型和Potts模型有很多联系 3.在完备图上的键逾渗,属于在随机图上 ...
- system调用命令行命令而不显示命令行窗口
system调用命令行命令而不显示命令行窗口 通常用system调用命令行命令时都会弹出黑底白字的命令行窗口,下面的代码可以不显示弹出的命令行窗口. 代码如下 #pragma comment( lin ...
- JDBC 笔记3 通过PreparedStatement 对数据库进行增删改查 (转载)
之前MVC时一直用它,学了框架后就没怎么用了.这里转载一位同学的博客,以后可能也会用到的. 转自:https://www.cnblogs.com/zilong882008/archive/2011/1 ...
- [调试AvantCourier的笔记]
1.manifest里不能设置target sdk 不然会出现stale error. 2.manifest里要有Internet权限 3
- (转)使用cygwin注意事项一
原文出处:http://gotgit.readthedocs.io/en/latest/01-meet-git/050-install-on-windows-cygwin.html 在Windows下 ...
- AutoIT:界面与自动化操作结合来简化日常劳动: .Net Reactor验证License,设置License,创建License,截图AutoIt自动化实现。(七)
版本六中存在一个显著问题是: 当exe文件生存之后,运行的时候,通过consoleWrite函数打印出来的数据是无法展示出来的.这就存在一个问题:当运行失败的时候,我还是看不到任何log信息. 于是, ...
- 基于区域的全卷积神经网络(R-FCN)简介
在 Faster R-CNN 中,检测器使用了多个全连接层进行预测.如果有 2000 个 ROI,那么成本非常高. feature_maps = process(image)ROIs = region ...