题目

显然这就是让我们在二维上数个点

如果没有强制在线就随便做啦,扫描线+主席树应该是最好的选择

但是现在强制在线并且卡了树套树的空间,于是只能上\(kdt\)了

我们还是维护一下每个子树分割出来的矩形的四个坐标

查询的时候发现如果当前整个子树都被查询的矩形包含,我们就直接加入答案

如果完全没有交,我们就直接退出

否则我们判断一下是否要把当前子树的根加入答案,之后递归左右两边的子树就好了

在随机数据下拥有一个\(log\)的美妙复杂度,但是卡卡就变成根号了

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||x>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const double alph=0.7;
const int maxn=300005;
struct Point{int x[2],w;}p[maxn],a[maxn];
int l[maxn],r[maxn],sz[maxn],mx[maxn][2],mi[maxn][2],d[maxn],st[maxn];
int n,m,cnt,top,rt,lst,op,num;
inline int cmp(Point A,Point B) {return A.x[op]<B.x[op];}
inline int newnode() {
if(top) return st[top--];
return ++cnt;
}
inline void pushup(int k) {
mi[k][0]=mx[k][0]=p[k].x[0];
mi[k][1]=mx[k][1]=p[k].x[1];
for(re int i=0;i<2;i++) {
if(l[k]) mx[k][i]=max(mx[k][i],mx[l[k]][i]),
mi[k][i]=min(mi[k][i],mi[l[k]][i]);
if(r[k]) mx[k][i]=max(mx[k][i],mx[r[k]][i]),
mi[k][i]=min(mi[k][i],mi[r[k]][i]);
}
sz[k]=sz[l[k]]+sz[r[k]]+1;
d[k]=d[l[k]]+d[r[k]]+p[k].w;
}
int build(int x,int y,int o) {
if(x>y) return 0;
int mid=x+y>>1,k=newnode();
op=o;std::nth_element(a+x,a+mid,a+y+1,cmp);p[k]=a[mid];
l[k]=build(x,mid-1,o^1),r[k]=build(mid+1,y,o^1);
pushup(k);return k;
}
void kill(int k) {
if(l[k]) kill(l[k]);
st[++top]=k;a[++num]=p[k];
if(r[k]) kill(r[k]);
}
inline int check(int k,int o) {
if(max(sz[l[k]],sz[r[k]])>sz[k]*alph)
return num=0,kill(k),build(1,num,o);
return k;
}
int ins(Point a,int k,int o) {
if(!k) {
k=newnode();p[k]=a;pushup(k);
return k;
}
if(a.x[o]<=p[k].x[o]) l[k]=ins(a,l[k],o^1);
else r[k]=ins(a,r[k],o^1);
pushup(k);return check(k,o);
}
inline int pd(int x,int y,int xx,int yy,int k) {
return (x<=mi[k][0]&&xx>=mx[k][0]&&y<=mi[k][1]&&yy>=mx[k][1]);
}
inline int chk(int x,int y,int xx,int yy,int k) {
return (mi[k][0]>xx||mx[k][0]<x||mi[k][1]>yy||mx[k][1]<y);
}
int query(int x,int y,int xx,int yy,int k) {
if(!k||chk(x,y,xx,yy,k)) return 0;
if(pd(x,y,xx,yy,k)) return d[k];
int now=0;
if(x<=p[k].x[0]&&xx>=p[k].x[0]&&y<=p[k].x[1]&&yy>=p[k].x[1]) now+=p[k].w;
if(pd(x,y,xx,yy,l[k])&&l[k]) now+=d[l[k]];else now+=query(x,y,xx,yy,l[k]);
if(pd(x,y,xx,yy,r[k])&&r[k]) now+=d[r[k]];else now+=query(x,y,xx,yy,r[k]);
return now;
}
int main() {
n=read();
int opt,x,y,xx,yy,val;
while(1) {
opt=read();
if(opt==1) {
x=read()^lst,y=read()^lst;val=read()^lst;
Point a;a.x[0]=x,a.x[1]=y,a.w=val;
rt=ins(a,rt,0);
}
if(opt==2) {
x=read()^lst,y=read()^lst,xx=read()^lst,yy=read()^lst;
lst=query(x,y,xx,yy,rt);
printf("%d\n",lst);
}
if(opt==3) return 0;
}
return 0;
}

【bzoj 4066】 简单题的更多相关文章

  1. bzoj 4066: 简单题 kd-tree

    4066: 简单题 Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 234  Solved: 82[Submit][Status][Discuss] De ...

  2. BZOJ 4066 简单题(KD树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支 ...

  3. bzoj 4066 简单题——KDtree(带重构)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 带部分重构的KDtree.就是那个替罪羊树思想的. 写了对拍,调了半天,发现忘了 re ...

  4. bzoj 4066: 简单题 K-D树

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4066 题解 我们把每次的修改操作都当作二维平面上多了一个权值点 对于每组询问可以看做求一 ...

  5. BZOJ 4066 简单题 ——KD-Tree套替罪羊树

    [题目分析] 直接x,y二维轮番划分,暴力即可. 套上替罪羊,打碎重构,对于时间复杂度有了保证. 写起来好麻烦,重构的技巧很棒! [代码] #include <cstdio> #inclu ...

  6. bzoj 4066: 简单题

    #include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm> #d ...

  7. BZOJ 2683: 简单题

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

  8. BZOJ 3687: 简单题 bitset

    3687: 简单题 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 小呆开始研究集合论了,他 ...

  9. bzoj 4066 & bzoj 2683 简单题 —— K-D树(含重构)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 https://www.lydsy.com/JudgeOnline/problem.p ...

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

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

随机推荐

  1. Linux下的mysql默认大小写敏感

    在Linux下: 1.数据库名与表名是严格区分大小写的: 2.表的别名是严格区分大小写的: 3.列名与列的别名在所有的情况下均是忽略大小写的: 4.变量名也是严格区分大小写的: 在Windows下: ...

  2. [转]linux文件批量转码

    linux系统里提供的文件转化编码的命令iconv,例如: iconv -t utf- -f gb2312 -c test.xml > text_UTF8.xml -f  源编码-t  目标编码 ...

  3. Java Swing实战(一)JFrame和JTabbedPane容器

    概述: 项目是一个桌面程序,涉及标签和按钮组件.布局管理器组件.面板组件.列表框和下拉框组件等组件,以及Swing事件处理机制. 下面先从最基础的界面开始. /** * @author: lishua ...

  4. ASP.NET Core依赖注入

         一.什么是依赖注入(Denpendency Injection) 这也是个老身常谈的问题,到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Con ...

  5. mac,macbook 连接蓝牙耳机播放音乐断断续续

    个人的情况是, mac本连的网线,用的无线鼠标, 屋里80多号人都在用笔记本,应该也有好多开着无线的东西 解决方法: mac 或macbook 连接蓝牙耳机播放音乐断断续续的原因, 在网上找了好多方法 ...

  6. :after伪类+content内容生成经典应用举例——张鑫旭

    一.简单说说content内容生成 content内容生成就是通过content属性生成内容,content属性早在CSS2.1的时候就被引入了,可以使用:before以及:after伪元素生成内容. ...

  7. LINUX创建LVM、PV、VG、LV ORACLE服务器方案划分

    为裸盘分区 查看硬盘分区 fdisk -l 进入分区管理 fdisk /dev/sda 创建PV 创建PV pvcreate /dev/sda1 pvcreate /dev/sdb1 pvcreate ...

  8. Apache安装完后加入系统服务的相关操作详解

    Apache源码安装完毕后, 1.下面的脚本运行后就可以直接使用service apachexxx stop/start 来控制apache的启动与停止了! cp /usr/local/apache/ ...

  9. windows如何查看nvidia显卡(GPU)的利用率和温度

    windows如何查看nvidia显卡(GPU)的利用率和温度 nvidia-smi 只要在文件夹C:\Program Files\NVIDIA Corporation\NVSMI里找到文件nvidi ...

  10. MySQL的索引与优化

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...