简单题 bzoj-4066

题目大意:n*n的棋盘,开始为均为0,支持:单点加权值,查询矩阵权值和,强制在线。

注释:$1\le n\le 5\cdot 10^5$,$1\le m \le 2\cdot 10^5$。


想法:KD-Tree裸题。

所谓KD-Tree,就是一个看起来贼牛逼实际上我觉着也贼牛逼的暴力... ...

算了,网上讲解一摞摞,不赘述。

这里我们只需要在KD-Tree上维护子树和即可。单点加的话往上更新呗,或者换成删除+插入也能过。

最后,附上丑陋的代码... ...

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 500010
using namespace std;
struct data
{
int p[2],maxn[2],minn[2],c[2],w,sum;
}a[N];
int d,root;
inline bool cmp(const data &a,const data &b)
{
return a.p[d]==b.p[d]?a.p[d^1]<b.p[d^1]:a.p[d]<b.p[d];
}
inline void pushup(int k,int s)
{
a[k].maxn[0]=max(a[k].maxn[0],a[s].maxn[0]);
a[k].minn[0]=min(a[k].minn[0],a[s].minn[0]);
a[k].maxn[1]=max(a[k].maxn[1],a[s].maxn[1]);
a[k].minn[1]=min(a[k].minn[1],a[s].minn[1]);
a[k].sum+=a[s].sum;
}
int build(int l,int r,int now)
{
int mid=(l+r)>>1;
d=now,nth_element(a+l,a+mid,a+r+1,cmp);
a[mid].maxn[0]=a[mid].minn[0]=a[mid].p[0];
a[mid].maxn[1]=a[mid].minn[1]=a[mid].p[1];
a[mid].sum=a[mid].w;
a[mid].c[0]=a[mid].c[1]=0;
if(l<mid)a[mid].c[0]=build(l,mid-1,now^1),pushup(mid,a[mid].c[0]);
if(r>mid)a[mid].c[1]=build(mid+1,r,now^1),pushup(mid,a[mid].c[1]);
return mid;
}
void ins(int x)
{
int *t=&root;
d=0;
while(*t)pushup(*t,x),t=&a[*t].c[a[x].p[d]>a[*t].p[d]],d^=1;
*t=x;
}
int query(int k,int x1,int y1,int x2,int y2)
{
if(!k||a[k].maxn[0]<x1||a[k].maxn[1]<y1||a[k].minn[0]>x2||a[k].minn[1]>y2)return 0;
if(a[k].maxn[0]<=x2&&a[k].maxn[1]<=y2&&a[k].minn[0]>=x1&&a[k].minn[1]>=y1)return a[k].sum;
int ans=0;
if(a[k].p[0]>=x1&&a[k].p[0]<=x2&&a[k].p[1]>=y1&&a[k].p[1]<=y2)ans+=a[k].w;
ans+=query(a[k].c[0],x1,y1,x2,y2)+query(a[k].c[1],x1,y1,x2,y2);
return ans;
}
int main()
{
int opt,x1,y1,x2,y2,last=0,tot=0;
scanf("%*d");
while(scanf("%d",&opt)!=EOF&&opt!=3)
{
if(opt==1)
{
tot++,scanf("%d%d%d",&a[tot].p[0],&a[tot].p[1],&a[tot].w);
a[tot].p[0]^=last,a[tot].p[1]^=last,a[tot].w^=last,a[tot].sum=a[tot].w;
a[tot].maxn[0]=a[tot].minn[0]=a[tot].p[0];
a[tot].maxn[1]=a[tot].minn[1]=a[tot].p[1];
ins(tot);
if(tot%10000==0)root=build(1,tot,0);
}
else scanf("%d%d%d%d",&x1,&y1,&x2,&y2),x1^=last,y1^=last,x2^=last,y2^=last,printf("%d\n",last=query(root,x1,y1,x2,y2));
}
return 0;
}

小结:KD-Tree更好玩... ...

[bzoj4066/2683]简单题_KD-Tree的更多相关文章

  1. BZOJ 2683: 简单题

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

  2. bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...

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

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

  4. 【BZOJ4066】简单题 KDtree

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

  5. BZOJ4066:简单题(K-D Tree)

    Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作:   命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 ...

  6. BZOJ 2683: 简单题(CDQ分治 + 树状数组)

    BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...

  7. BZOJ 2683: 简单题 [CDQ分治]

    同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...

  8. 【bzoj4066】 简单题

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

  9. BZOJ4066:简单题

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

随机推荐

  1. 搭建Git服务器(转载)

    转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360 ...

  2. Is the Information Reliable?(差分约束系统)

    http://poj.org/problem?id=2983 题意:给出M条信息,判断这些信息的正确性.(1)V A B :表示A,B之间的距离>=1; (2)P A B X :表示A B之间的 ...

  3. Aspose Cells dll 实现数据简单下载

    Workbook workbook = new Workbook(); //工作簿                     Worksheet sheet = workbook.Worksheets[ ...

  4. form表单中图片也可以当作提交按钮

    点击图片按钮时,不光提交其他输入框信息,还把鼠标点击图片上的x,y坐标也传输过去了

  5. Nginx一个实现负载均衡的强大web server

    <转>nginx 这个轻量级.高性能的 web server 主要可以干两件事情: 〉直接作为http server(代替apache,对PHP需要FastCGI处理器支持): 〉另外一个 ...

  6. photoshop制作古风画

    效果图: 素材结构: 前期准备: 素材准备,我的素材包括:印章.花束.二次元妹纸,背景图片. 软件准备,用的软件是 photoshop CS6. 把二次元妹纸拖入photoshop,把她抠出来,Ctr ...

  7. [Android]异常8-android.view.WindowManager$BadTokenException

    背景:Service服务中使用WindowManager时,Android4.4使用正常,Android6.0使用应用崩溃停止运行,提示android.view.WindowManager$BadTo ...

  8. html5——web字体

    基本介绍 1.自定义网页特殊字体,无需考虑用户电脑上是否安装了此特殊字体,从此把特殊字体处理成图片的时代便成为了过去. 2.支持程度比较好,甚至IE低版本浏览器也能支持. 3.web字体的大小鉴定是字 ...

  9. img图片加载出错处理

    img图片加载出错处理   为了美观当网页图片不存在时不显示叉叉图片 当在页面显示的时候,万一图片被移动了位置或者丢失的话,将会在页面显示一个带X的图片,很是影响用户的体验.即使使用alt属性给出了” ...

  10. yum仓库配置ftpx协议

    [root@localhost ~]# iptables -F[root@localhost ~]# systemctl stop firewalld[root@localhost ~]# syste ...