传送门

这题真简单,直接把\(CDQ\)给ban掉了

其实数据范围比较小可以直接二维树状数组,我们看数据范围,发现点的个数比N还小,可以考虑用一些奇怪的数据结构

说的就是你,\(KD tree\)

\(KD tree\)就是一个K维的二叉查找树(是吧),一维的二叉查找树就是我们所熟悉的平衡树,所以考虑用平衡树的方法维护,插入一个点就跟平衡树插一个点类似.查找的话,如果当前范围完全被查询范围完全包含就直接加上范围值,如果有交就递归处理,没交就不管

注意维护整棵\(KD tree\)使其平衡,可以考虑替罪羊树,如果某个儿子子树大小>子树*\(alpha\)就将整棵子树暴力重构

细节详见代码 其实是不想写了

#include<bits/stdc++.h>
#define LL long long
#define db double
#define il inline
#define re register
#define ft first
#define sc second
#define mkpr make_pair using namespace std;
const int N=2e5+10;
const db alpha=0.72;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int dd;
#define lc (s[o].ch[0])
#define rc (s[o].ch[1])
struct point
{
int a,d[2];
bool operator < (const point &bb) const {return d[dd]<bb.d[dd];}
}pp[N];
struct node
{
int ch[2],mi[2],ma[2],a,sz;
point p;
void clr(){ch[0]=ch[1]=mi[0]=mi[1]=ma[0]=ma[1]=a=sz=p.a=0;}
}s[N];
il void upd(int o,int x)
{
s[o].mi[0]=min(s[o].mi[0],s[x].mi[0]),s[o].mi[1]=min(s[o].mi[1],s[x].mi[1]);
s[o].ma[0]=max(s[o].ma[0],s[x].ma[0]),s[o].ma[1]=max(s[o].ma[1],s[x].ma[1]);
}
il void psup(int o)
{
s[o].sz=s[lc].sz+s[rc].sz+1;
s[o].a=s[lc].a+s[rc].a+s[o].p.a;
s[o].mi[0]=s[o].ma[0]=s[o].p.d[0],s[o].mi[1]=s[o].ma[1]=s[o].p.d[1];
if(lc) upd(o,lc);
if(rc) upd(o,rc);
}
int st[N],tp,tt,m;
il int newnode()
{
if(!tp) return ++tt;
s[st[tp]].clr();
return st[tp--];
}
void del(int o)
{
if(lc) del(lc);
pp[++m]=s[o].p,st[++tp]=o;
if(rc) del(rc);
}
int bui(int l,int r,int d)
{
if(l>r) return 0;
dd=d;
int mid=(l+r)>>1,o=newnode();
nth_element(pp+l,pp+mid,pp+r+1);
s[o].p=pp[mid];
lc=bui(l,mid-1,d^1),rc=bui(mid+1,r,d^1);
psup(o);
return o;
}
void inst(int &o,int d,point a)
{
if(!o) {o=newnode(),s[o].p=a,psup(o);return;}
int mid=(s[o].mi[d]+s[o].ma[d])>>1;
if(a.d[d]<=mid) inst(lc,d^1,a);
else inst(rc,d^1,a);
psup(o);
if((db)s[o].sz*alpha<(db)max(s[lc].sz,s[rc].sz)) m=0,del(o),o=bui(1,m,d);
}
int quer(int o,int lx,int ly,int rx,int ry)
{
int an=0;
if(lx<=s[o].p.d[0]&&ly<=s[o].p.d[1]&&rx>=s[o].p.d[0]&&ry>=s[o].p.d[1]) an+=s[o].p.a;
if(lc)
{
if(lx<=s[lc].mi[0]&&ly<=s[lc].mi[1]&&rx>=s[lc].ma[0]&&ry>=s[lc].ma[1]) an+=s[lc].a;
else if(max(lx,s[lc].mi[0])<=min(rx,s[lc].ma[0])&&max(ly,s[lc].mi[1])<=min(ry,s[lc].ma[1])) an+=quer(lc,lx,ly,rx,ry);
}
if(rc)
{
if(lx<=s[rc].mi[0]&&ly<=s[rc].mi[1]&&rx>=s[rc].ma[0]&&ry>=s[rc].ma[1]) an+=s[rc].a;
else if(max(lx,s[rc].mi[0])<=min(rx,s[rc].ma[0])&&max(ly,s[rc].mi[1])<=min(ry,s[rc].ma[1])) an+=quer(rc,lx,ly,rx,ry);
}
return an;
}
int n,rt,ans; int main()
{
n=rd();
while(233)
{
int op=rd();
if(op==1)
{
int x=rd()^ans,y=rd()^ans,z=rd()^ans;
inst(rt,0,(point){z,x,y});
}
else if(op==2)
{
int lx=rd()^ans,ly=rd()^ans,rx=rd()^ans,ry=rd()^ans;
printf("%d\n",ans=quer(rt,lx,ly,rx,ry));
}
else break;
}
return 0;
}

luogu P4148 简单题的更多相关文章

  1. Luogu P4148 简单题(K-D Tree)

    题面 题解 因为强制在线,所以我们不能$cdq$分治,所以考虑用$KDT$,$KDT$维护一个矩阵,然后询问的时候如果当前矩形在询问区间内,直接记贡献,否则判断当前点是否在矩阵内,然后左右分别递归下去 ...

  2. 洛谷 P4148 简单题 解题报告

    P4148 简单题 题意 维护单点加与矩形求和,强制在线 说明 \(n\le 500000,m\le 200000\),\(4000ms / 20MB\) kd-tree 复杂度我不懂 是一颗平衡树, ...

  3. 洛谷 P4148 简单题 KD-Tree 模板题

    Code: //洛谷 P4148 简单题 KD-Tree 模板题 #include <cstdio> #include <algorithm> #include <cst ...

  4. P4148 简单题(KDTree)

    传送门 KDTree 修改权值当做插入节点,不平衡就暴力重构,询问的时候判断当前节点代表的矩形是否在询问的矩形的,是的话返回答案,相离返回0,否则的话判断当前点是否在矩形内,然后继续递归下去 //mi ...

  5. P4148 简单题 k-d tree

    思路:\(k-d\ tree\) 提交:2次 错因:整棵树重构时的严重错误:没有维护父子关系(之前写的是假重构所以没有维护父子关系) 题解: 遇到一个新的点就插进去,如果之前出现过就把权值加上. 代码 ...

  6. BZOJ 2683: 简单题

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

  7. 【BZOJ-1176&2683】Mokia&简单题 CDQ分治

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  8. Bzoj4066 简单题

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

  9. Bzoj2683 简单题

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

随机推荐

  1. goroutine与调度器

    29 November 2013 by skoo 我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine.goroutine就是Go语言提供的一种用户态线程,当然这种用 ...

  2. 图片margin:0 auto;为何不居中

    图片margin:0 auto;为何不居中 关键: img元素 display设为block 代码: <!DOCTYPE html> <html> <head> & ...

  3. yzh的神仙题

    U66905 zz题 考虑一个点权值被计算了多少次...不知 所以对未来承诺,方便直接算上总数! 然后其实是给边定向,即先删除fa和son的哪一个 f[x][j],会计算j次 无法转移 f[x][j] ...

  4. 【NOI2013模拟】坑带的树(仙人球的同构+圆方树乱搞+计数+HASH)

    [NOI2013模拟]坑带的树 题意: 求\(n\)个点,\(m\)条边的同构仙人球个数. \(n\le 1000\) 这是一道怎么看怎么不可做的题. 这种题,肯定是圆方树啦~ 好,那么首先转为广义圆 ...

  5. Linux系统上安装nodejs

    1 官网下载地址:https://nodejs.org/en/download/ 2 下载的node-v10.15.2-linux-x64.tar.xz  上传到Linux系统后  因为安装的是纯净版 ...

  6. Hadoop记录-HDFS配额Quota

    设置文件数配额 hdfs dfsadmin -setQuota <N> <directory>...<directory> 例如:设置目录下的文件总数为1000个h ...

  7. Hadoop记录-Hadoop集群重要监控指标

    通用监控指标 对于每个RPC服务应该监控 RpcProcessingTimeAvgTime(PRC处理的平均时间) 通常hdfs在异常任务突发大量访问时,这个参数会突然变得很大,导致其他用户访问hdf ...

  8. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  9. wav音频文件格式解析【个人笔记】(自用)

    1. WAV格式 wav是微软开发的一种音频文件格式,注意,wav文件格式是无损音频文件格式,相对于其他音频格式文件数据是没有经过压缩的,通常文件也相对比较大些.. 支持多种音频数字,取样频率和声道, ...

  10. svn Edge访问规则配置

    权限的配置方法: 首先在用户页面定义用户,然后在版本库页面,手工填写访问规则. 以下面的配置为例(实际配置中应删除“//”及其后的注释): [groups]               //定义用户组 ...