题解:

前一题不是强制在线,后一题是强制在线

树套树空间会炸

说一下cdq分治+树状数组

首先我们利用cdq分治使得查询和操作保证先后关系

然后矩阵查询变成4个矩阵的差

那么我们就可以运用扫描线的方法来维护了

时间nlogn^2,空间O(n)

后一题是kd-tree

查询的方法和线段树基本一样

如果矩阵被包含就返回答案,如果不被包含就直接退出

否则递归下去

然后修改的话和替罪羊树一样

达到一定时候就重构

注意一下x相同insert和build要保证y的顺序区分左右

另外学习了一下map中用struct作为key的方法 虽然这题完全不用用

代码:

#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define mid ((h+t)/2)
#define me(x) memset(x,0,sizeof(x))
const int INF=2e9;
const int N=6e6+1e4;
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
IL void umax(int &x,int y)
{
if (x<y) x=y;
}
IL void umin(int &x,int y)
{
if (x>y) x=y;
}
struct re{
int d[],v;
}p[N];
int cmp_d,ans,rt,num;
bool cmp(re x,re y)
{
return x.d[cmp_d]<y.d[cmp_d]||(x.d[cmp_d]==y.d[cmp_d]&&x.d[cmp_d^]<y.d[cmp_d^]);
}
struct kd
{
int Mx[N],My[N],Nx[N],Ny[N],count2[N],ls[N],rs[N];
IL void clear()
{
me(count2);
me(ls); me(rs);
}
IL void updata(int x)
{
count2[x]=count2[ls[x]]+count2[rs[x]]+p[x].v;
if (ls[x])
{
umax(Mx[x],Mx[ls[x]]);
umax(My[x],My[ls[x]]);
umin(Nx[x],Nx[ls[x]]);
umin(Ny[x],Ny[ls[x]]);
}
if (rs[x])
{
umax(Mx[x],Mx[rs[x]]);
umax(My[x],My[rs[x]]);
umin(Nx[x],Nx[rs[x]]);
umin(Ny[x],Ny[rs[x]]);
}
}
int build(int h,int t,int o)
{
cmp_d=o; nth_element(p+h,p+mid,p+t+,cmp);
int x=mid;
Mx[x]=Nx[x]=p[x].d[];
My[x]=Ny[x]=p[x].d[];
count2[x]=p[x].v;
if (h!=x) ls[x]=build(h,mid-,o^); else ls[x]=;
if (x!=t) rs[x]=build(mid+,t,o^); else rs[x]=;
updata(x);
return x;
}
void insert(int &k,int x,int y,int z,int o)
{
if (!k)
{
k=++num;
Mx[num]=Nx[num]=p[num].d[];
My[num]=Ny[num]=p[num].d[];
count2[num]=p[num].v=z;
return;
}
if (p[k].d[]==x&&p[k].d[]==y)
{
count2[k]+=z; p[k].v+=z; return;
}
if (!o)
if (x<p[k].d[]||(x==p[k].d[]&&y<p[k].d[])) insert(ls[k],x,y,z,o^);
else insert(rs[k],x,y,z,o^);
else if (y<p[k].d[]||(y==p[k].d[]&&x<p[k].d[])) insert(ls[k],x,y,z,o^);
else insert(rs[k],x,y,z,o^);
updata(k);
}
void query(int k,int x1,int x2,int y1,int y2)
{
if (!k||Mx[k]<x1||Nx[k]>x2||My[k]<y1||Ny[k]>y2) return;
if (x2>=Mx[k]&&Nx[k]>=x1&&y2>=My[k]&&Ny[k]>=y1)
{
ans+=count2[k]; return;
}
if (x1<=p[k].d[]&&p[k].d[]<=x2&&y1<=p[k].d[]&&p[k].d[]<=y2)
ans+=p[k].v;
query(ls[k],x1,x2,y1,y2); query(rs[k],x1,x2,y1,y2);
}
}kd;
struct re1{
int a,b;
};
struct cmp2
{
bool operator() (const re1 x,const re1 y)
{
if (x.a<y.a||(x.a==y.a&&x.b<y.b)) return(); else return();
}
};
map<re1,int,cmp2> M;
int main()
{
int m;
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
read(m);
int cnt=,rt=,i=;
while ()
{
i++;
ans=;
int k;
read(k);
if (k==) break;
if (k==)
{
int x,y,z;
read(x); read(y); read(z);
x^=ans; y^=ans; z^=ans;
re1 k3=(re1){x,y};
int kk=M[k3];
if (!kk) p[num+].d[]=x,p[num+].d[]=y,kk=num+;
M[k3]=kk;
kd.insert(rt,x,y,z,);
cnt++;
if (cnt%==)
{
kd.clear();
rt=kd.build(,num,);
}
} else
{
int x1,x2,y1,y2;
read(x1),read(y1),read(x2),read(y2);
x1^=ans,x2^=ans,y1^=ans,y2^=ans;
ans=;
kd.query(rt,x1,x2,y1,y2);
cout<<ans<<endl;
}
} return ;
}

bzoj2683&&bzoj4066的更多相关文章

  1. [BZOJ2683][BZOJ4066]简单题

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

  2. [基本操作] kd 树

    概念就不说了吧,网上教程满天飞 学了半天才知道,kd 树实质上只干了两件事情: 1.快速定位一个点 / 矩形 2.有理有据地优化暴力 第一点大概是可以来做二维平面上给点/矩形打标记的问题 第二点大概是 ...

  3. Bzoj4066 简单题

    Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 2185  Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...

  4. BZOJ4066 简单题(KD-Tree)

    板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  5. 【bzoj4066】 简单题

    http://www.lydsy.com/JudgeOnline/problem.php?id=4066 (题目链接) 题意 维护一个矩阵,两个操作,给某一个元素加上A,求其中一个子矩阵的元素之和.强 ...

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

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

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

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

  8. 【BZOJ4066】简单题(KD-Tree)

    [BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...

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

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

随机推荐

  1. 【转】C++标准转换运算符const_cast

    const_cast转换符是用来移除变量的const或volatile限定符. 对于const变量,我们不能修改它的值,这是这个限定符最直接的表现.但是我们就是想违背它的限定希望修改其内容怎么办呢? ...

  2. 【转】Linux中profile、bashrc、bash_profile之间的区别和联系

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登陆时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置. 英文描述为: # /etc/pr ...

  3. 使用tomcat发布含有shtml文件的web程序

    平常都是使用html或jsp,当导入含有shtml的一个web项目时,向平常一样使用Jetty运行,访问到shtml文件时,直接在浏览器上显示出了源码. 查询,使用tomcat发布,修改tomcat的 ...

  4. php password_hash

    2018-1-6 17:22:13 星期六 php 自带的密码生成方法, 如果生成密码最好使用这个, 这个是"单程"的, 没有解密函数 $a = '123456'; $b = pa ...

  5. java结合testng,利用yaml做数据源的数据驱动实例

    testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本.在这以yaml为例: 备注:@DataProvider的返回 ...

  6. Oracle的AES加密与解密用法

    Oracle的AES加密与解密用法2013年12月11日 11:50:35 iteye_751 阅读数:428--加密字符串create or replace function des3_enc( i ...

  7. TIMESTAMPN(N) WITH LOCAL TIMEZONE数据类型转换

    --TYPE#=231为TIMESTAMP(N) WITH LOCAL TIME ZONE,181为TIMESTAMP(N) WITH TIME ZONEselect u.name || '.' || ...

  8. Modbus库开发笔记之二:Modbus消息帧的生成

    前面我们已经对Modbus的基本事务作了说明,也据此设计了我们将要实现的主从站的操作流程.这其中与Modbus直接相关的就是Modbus消息帧的生成.Modbus消息帧也是实现Modbus通讯协议的根 ...

  9. oracle 根据一个时间段获取这个时间段内所有月份、天数、日期

    注:本文来源于< oracle 根据一个时间段获取这个时间段内所有月份.天数.日期 > 获取月份列表: SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2014-10 ...

  10. ORA-00257 archiver error. 错误的处理方法

    archive log 日志已满 方法/步骤 1 SecureCRT登录服务器,切换用户oracle,连接oracle [root@userbeta~]# su - oracle [oracle@us ...