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. (原创)解决Excel 互操作错误"检索COML类工厂中 CLSID为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005"

    最近在.net中处理Excel文件数据导入时报出以下错误: 检索COML类工厂中 CLSID为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下 ...

  2. U-boot与linux的关系

    基本上没有啥关系,U-boot的话你也知道,说白了就像是Dos工具箱,本身算是个精简的Linux系统了,主要是负责硬件的初始化和引导,本身带有一些工具,作为引导程序,常作为嵌入式设备的引导.当真正的系 ...

  3. .net程序员转行做手游开发经历(一)

    从辞职到自己开发游戏也有几个月的时间了,游戏也已经在AppStore上线了,我觉得我有必要写点东西,算是留下的一些记忆,也可以和广大博友分享下自己的创业经历,这可能不是一篇成功的创业经历,因为故事还在 ...

  4. 20160220 - JavaScript for OS X Automation 调试技巧

    在JXA代码中加入如下代码后,可使用 Safari Web Inspector 调试: //debugger; 使用 Safari Web Inspector 查看 Array 或 Object 并不 ...

  5. JS 问题集锦

    [1]js页面跳转 和 js打开新窗口方法 第一种: <script language="javascript" type="text/javascript&quo ...

  6. C# Task 用法

    C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...

  7. restFull常用注解

    @GET.@POST.@PUT.@DELETE.@HEAD您可以使用它们来绑定根资源或子资源内的 Java 方法与 HTTP 请求方法.HTTP GET 请求被映射到由 @GET 注释的方法,以此类推 ...

  8. MyBatis学习--高级映射

    简介 前面说过了简单的数据库查询和管理查询,在开发需求中有一些一对一.一对多和多对多的需求开发,如在开发购物车的时候,订单和用户是一对一,用户和订单是一对多,用户和商品是多对多.这些在Hibernat ...

  9. [转]《Hadoop基础教程》之初识Hadoop

    原文地址:http://blessht.iteye.com/blog/2095675 Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不 ...

  10. [转]Hibernate查询对象所有字段,单个字段 ,几个字段取值的问题

    原文地址:http://www.ablanxue.com/prone_3552_1.html 1. 查询整个映射对象所有字段 Java代码 //直接from查询出来的是一个映射对象,即:查询整个映射对 ...