Time Limit: 50 Sec  Memory Limit: 128 MB
Submit: 1071  Solved: 428

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。

Source

嘛,真是简单题啊,才调了两天就过了。

K-Dtree定期重构,强行维护数据。常数写不好的话会T飞。

之前把47行的左右边界取错了,时间复杂度直接突破天际。

 /*by SilverN*/
 #include<algorithm>
 #include<iostream>
 #include<cstring>
 #include<cstdio>
 #include<cmath>
 #include<vector>
 #define LL long long
 using namespace std;
 ;
 LL read(){
     LL x=,f=;char ch=getchar();
     ;ch=getchar();}
     +ch-';ch=getchar();}
     return x*f;
 }
 struct node{
     int l,r;
     ],max[];
     ];
     int w;
     LL sum;
 }t[mxn];
 ,nowD;
 int cmp(const node a,const node b){
     return a.d[nowD]<b.d[nowD];
 }
 int n,cnt;
 ;
 inline void pushup(int rt,int x){
     t[rt].max[]=max(t[rt].max[],t[x].max[]);
     t[rt].max[]=max(t[rt].max[],t[x].max[]);
     t[rt].min[]=min(t[rt].min[],t[x].min[]);
     t[rt].min[]=min(t[rt].min[],t[x].min[]);
     return;
 }
 inline bool in(int x1,int y1,int x2,int y2,int k){
     ] && t[k].max[]<=x2 &&
         y1<=t[k].min[] && t[k].max[]<=y2);
 }
 inline bool out(int x1,int y1,int x2,int y2,int k){
     ] || x2<t[k].min[] || y1>t[k].max[] || y2<t[k].min[]);
 }
 int Build(int l,int r,int D){
     ;
     nowD=D;;
     nth_element(t+l,t+mid,t+r+,cmp);///
     t[mid].max[]=t[mid].min[]=t[mid].d[];
     t[mid].max[]=t[mid].min[]=t[mid].d[];
     t[mid].sum=t[mid].w;
     t[mid].l=Build(l,mid-,D^);
     if(t[mid].l)pushup(mid,t[mid].l);
     t[mid].r=Build(mid+,r,D^);
     if(t[mid].r)pushup(mid,t[mid].r);
     t[mid].sum=t[mid].w+t[t[mid].l].sum+t[t[mid].r].sum;
     return mid;
 }
 void insert(int &now,int x,int D){
     if(!now){now=x;return;}
     if(t[x].d[D]==t[now].d[D] && t[x].d[!D]==t[now].d[!D]){
         t[now].w+=t[x].w;
         t[now].sum+=t[x].w;
         --cnt;
         return;
     }
     if(t[x].d[D]<t[now].d[D]){
         insert(t[now].l,x,D^);
         pushup(now,t[now].l);
     }
     else{
         insert(t[now].r,x,D^);
         pushup(now,t[now].r);
     }
     t[now].sum=t[now].w+t[t[now].l].sum+t[t[now].r].sum;
     return;
 }
 LL query(int rt,int x1,int y1,int x2,int y2){
     ;
     LL res=;
     if(in(x1,y1,x2,y2,rt)){return t[rt].sum;}
     ;}
     ] && t[rt].d[]<=x2 &&
         y1<=t[rt].d[] && t[rt].d[]<=y2) res+=t[rt].w;
     res+=query(t[rt].l,x1,y1,x2,y2)+query(t[rt].r,x1,y1,x2,y2);
     return res;
 }
 int main(){
     int i,j,op,x,y,w;
     n=read();lim=;
     int X1,X2,Y1,Y2;
     ){
         op=read();
         )break;
         ){
             t[++cnt].d[]=read();t[cnt].d[]=read();
             t[cnt].w=read();t[cnt].sum=t[cnt].w;
             t[cnt].max[]=t[cnt].min[]=t[cnt].d[];
             t[cnt].max[]=t[cnt].min[]=t[cnt].d[];
             insert(root,cnt,);
             if(cnt==lim){
                 lim+=;
                 root=Build(,cnt,);
             }
         }
         else{

             X1=read();Y1=read();X2=read();Y2=read();
             printf("%lld\n",query(root,X1,Y1,X2,Y2));
         }
     }
     ;
 }

Bzoj2683 简单题的更多相关文章

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

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

  2. bzoj2683简单题 cdq分治

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

  3. bzoj2683简单题

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

  4. BZOJ2683: 简单题(cdq分治 树状数组)

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2142  Solved: 874[Submit][Status][Discuss] Descripti ...

  5. BZOJ2683 简单题(CDQ分治)

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

  6. Bzoj2683 简单题 [CDQ分治]

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

  7. 【对询问分块】【主席树】bzoj2683 简单题

    对操作序列分块,每S次暴力重建主席树. 当S=sqrt(n*log(n))时,复杂度为O(m*sqrt(n*log(n))). 在线的. #include<cstdio> #include ...

  8. cdq分治——bzoj2683简单题

    https://www.lydsy.com/JudgeOnline/problem.php?id=2683 知识点:1.以操作的顺序进行分治  2.cdq分治维护矩阵 3.计算比mid小的给比mid大 ...

  9. [BZOJ2683][BZOJ4066]简单题

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

随机推荐

  1. C++变量命名规则

    转自:http://www.cnblogs.com/finallyliuyu/archive/2010/09/25/1834301.html 浅谈C++变量命名规则 不知道别的公司如何,反正我现在的公 ...

  2. hadoop 2.6全分布安装

    环境:centos 6.6 + hadoop2.6 虚拟机:(vmware fusion 7.0.0) 虚拟机hostname      /    IP地址 master / 192.168.187. ...

  3. unity3d 三分钟实现简单的赛车漂移

    提到赛车游戏,大家最关心的应该就是漂移吧?! 从学unity开始,我就一直在断断续续的研究赛车 因为自己技术太烂.悟性太差等原因,我走了不少弯路 也许你会说,网上那么多资料,你不会查啊 是啊!网上一搜 ...

  4. (二十三)原型模式详解(clone方法源码的简单剖析)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 原型模式算是JAVA中最简单 ...

  5. sql server 字符串函数str()

    语法: STR(nExpres[,nLength[,nDecimalPlaces]]) 参数: nExpression------STR要计算的数值表达式. nLength------------ST ...

  6. 将Microsoft Ajax Minifier集成到VS2013对JS、CSS进行编译时压缩

    在网站发布中,一般要将js,css文件压缩减少体积,以减少在HTTP请求中的流量.将Microsoft Ajax Minifier集成到VS2013中就可以对JS.CSS进行编译时压缩. VS2013 ...

  7. PotPlayer为播放而生的专业播放器

    韩国,比较牛逼的视频播放器.专注与本地视频播放,值得拥有.... 免费下载:http://yunpan.cn/cmZ5ELC6DTI8Y  访问密码 4bf1

  8. Go--避免SQL注入

    避免SQL注入 什么是SQL注入 SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞.可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出 ...

  9. JS是按值传递还是按引用传递

    按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本.修改形参的值并不会影响实参. 按引用传递(call by reference)时,函数的形参接收实参的隐式 ...

  10. 【BZOJ 2152】聪聪可可 点分治

    对于一棵树,fdrt找到重心,然后分治每个子树. 在一棵以重心为根的树上,符合条件的链是: 1.过重心(根) 2.不过重心 对于1我们只需dfs出距离重心(根)的距离然后统计再减去有重叠的边 对于2我 ...