2683: 简单题

Time Limit: 50 Sec  Memory Limit: 128 MB
Submit: 1018  Solved: 413
[Submit][Status][Discuss]

Description

你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作:

命令

参数限制

内容

1 x y A

1<=x,y<=N,A是正整数

将格子x,y里的数字加上A

2 x1 y1 x2 y2

1<=x1<= x2<=N

1<=y1<= y2<=N

输出x1 y1 x2 y2这个矩形内的数字和

3

终止程序

Input

输入文件第一行一个正整数N。
接下来每行一个操作。
 

Output

对于每个2操作,输出一个对应的答案。
 

Sample Input

4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

Sample Output

3
5

HINT

1<=N<=500000,操作数不超过200000个,内存限制20M。
对于100%的数据,操作1中的A不超过2000。
双倍经验
看到了无聊交了一下。。。
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
struct data
{
int x,y,dir,pos,type,delta;
}event[N];
int n,size,w,s,m,pos,opt;
vector<data> c;
int tree[N],ans[N];
bool cp(data x,data y)
{
if(x.x!=y.x) return x.x<y.x;
if(x.y!=y.y) return x.y<y.y;
return x.type<y.type;
}
int lowbit(int x)
{
return x&(-x);
}
void update(int pos,int delta)
{
for(int i=pos;i<=N+;i+=lowbit(i))
{
tree[i]+=delta;
}
}
int sum(int pos)
{
int ret=;
for(int i=pos;i>;i-=lowbit(i))
{
ret+=tree[i];
}
return ret;
} void cdq(int l,int r)
{
if(l>=r) return;
int mid=(l+r)/;
cdq(l,mid);
cdq(mid+,r);
c.clear();
for(int i=l;i<=mid;i++)
if(event[i].type==) c.push_back(event[i]);
for(int i=mid+;i<=r;i++)
if(event[i].type==) c.push_back(event[i]);
sort(c.begin(),c.end(),cp);
for(int i=;i<c.size();i++)
{
// printf("type=%d pos=%d\n",c[i].type,c[i].pos);
if(c[i].type==)
update(c[i].y,c[i].delta);
if(c[i].type==)
{
ans[c[i].pos]+=sum(c[i].y)*c[i].dir;
// printf("%d\n",sum(c[i].y));
}
}
for(int i=;i<c.size();i++)
if(c[i].type==) update(c[i].y,-c[i].delta);
} void addquery(int x,int y,int dir)
{
event[++m].x=x; event[m].y=y;
event[m].dir=dir; event[m].pos=pos;
event[m].type=;
} int main()
{
scanf("%d",&s);
while(scanf("%d",&opt))
{
if(opt==) break;
int x,y,delta,x1,y1,x2,y2;
if(opt==)
{
scanf("%d%d%d",&x,&y,&delta);
x++;
y++;
m++;
event[m].type=opt;
event[m].x=x;
event[m].y=y;
event[m].delta=delta;
}
else if(opt==)
{
++pos;
//ans[++pos]+=abs(x1-x2)*abs(y1-y2)*s;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++; x2++; y1++; y2++;
addquery(x1-,y1-,);
addquery(x2,y2,);
addquery(x1-,y2,-);
addquery(x2,y1-,-);
}
}
cdq(,m);
for(int i=;i<=pos;i++)
{
printf("%d\n",ans[i]);
}
return ;
}

bzoj2683的更多相关文章

  1. [BZOJ2683][BZOJ4066]简单题

    [BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...

  2. [BZOJ2683]简单题/[BZOJ1176][BalkanOI2007]Mokia

    [BZOJ2683]简单题 题目大意: 一个\(n\times n(n\le5\times10^5)\)的矩阵,初始时每个格子里的数全为\(0\).\(m(m\le2\times10^5)\)次操作, ...

  3. 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治

    [BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...

  4. 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组

    bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...

  5. BZOJ2683 简单题(CDQ分治)

    传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...

  6. bzoj2683简单题

    #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> ...

  7. Bzoj2683 简单题 [CDQ分治]

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...

  8. Bzoj2683 简单题

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...

  9. bzoj2683简单题 cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1803  Solved: 731[Submit][Status][Discuss] ...

随机推荐

  1. ios 显示缓存数据库

    IOS8以前版本, 如果是模拟器的话, 在这个路径中找到你的应用:/Users/你的用户名/Library/Application Support/iPhone Simulator/5.1/Appli ...

  2. iOS开发之功能模块--用runtime给UIView类别拓展PressMenu工具

    这是个很有用的列别工具类,在聊天对话框添加和QQ一样的"复制.粘贴.取消"等选项,而且使用起来很方便,只要找到聊天泡泡内部的某个View,比如Label或者背景冒泡的UIImage ...

  3. Shell: test

    基本格式:test expression expression为test命令构造的表达式.这里expression是test命令可以理解的任何有效表达式,该简化格式将是读者可能会踫见的最常用格式返回值 ...

  4. Mysql时间类型处理

    关于Mysql中时间的处理 最近在读<人类简史>,读第二遍.只有晚上睡觉之前读一点点,有时候觉得一天可以抽出一个专门的时间来看书了,效率应该能高不少. 另外分享个网址可以随心创作 这里有一 ...

  5. Python学习笔记2-解析数据

    Import os; -- Python自带 print(os.getcwd()) -- 获得当前工作目录 os.chdir('/Users/longlong/Documents') -- 转换到/U ...

  6. Linux I/O多路复用

    Linux中一切皆文件,不论是我们存储在磁盘上的字符文件,可执行文件还是我们的接入电脑的I/O设备等都被VFS抽象成了文件,比如标准输入设备默认是键盘,我们在操作标准输入设备的时候,其实操作的是默认打 ...

  7. Android 手势操作识别

    (转自:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html) 首先,在Android系统中,每一次手势交互都会依照 ...

  8. openstack api快速入门

    原文:http://my.oschina.net/guol/blog/105430 openstack官方有提供api供开发者使用,可以使用api做一些外围的小工具,用来简化对openstack的管理 ...

  9. 一段拼装sql的小代码

    /** * 单表查询 * * className:实体类的名字 * vals:查询的属性 * pNames:条件的名字 * pVals:条件的值 */ @Override public List< ...

  10. NYOJ 105

    九的余数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数整除九之后的余数. 输入 第一行有一个整 ...