P4148 简单题

题意

维护单点加与矩形求和,强制在线

说明

\(n\le 500000,m\le 200000\),\(4000ms / 20MB\)


kd-tree

复杂度我不懂

是一颗平衡树,每一层以某一维的大小决定权值,像替罪羊那样重构


Code:

#include <cstdio>
#include <cctype>
#include <algorithm>
#define ls ch[now][0]
#define rs ch[now][1]
using std::min;
using std::max;
const int N=2e5+10;
const int K=2;
const double alpha=0.85;
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)) f=c=='-'?0:1,c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return f?x:-x;
}
int ch[N][2],L[N][K],R[N][K],sum[N],siz[N],val[N],pos[N][2],tot;
int num[N],cnt,ql[2],qr[2],nk,root;
void updata(int now)
{
sum[now]=sum[ls]+sum[rs]+val[now];
siz[now]=siz[ls]+siz[rs]+1;
for(int i=0;i<K;i++)
{
L[now][i]=R[now][i]=pos[now][i];
if(ls) L[now][i]=min(L[now][i],L[ls][i]),R[now][i]=max(R[now][i],R[ls][i]);
if(rs) L[now][i]=min(L[now][i],L[rs][i]),R[now][i]=max(R[now][i],R[rs][i]);
}
}
bool cmp(int a,int b){return pos[a][nk]<pos[b][nk];}
void build(int &now,int l,int r,int k)
{
if(l>r){now=0;return;}
int mid=l+r>>1;nk=k;
std::nth_element(num+l,num+mid,num+r+1,cmp);
now=num[mid];
build(ls,l,mid-1,k^1),build(rs,mid+1,r,k^1);
updata(now);
}
void era(int now)
{
if(!now) return;
era(ls),num[++cnt]=now,era(rs);
}
int New(int x,int y,int A)
{
siz[++tot]=1,sum[tot]=val[tot]=A;
L[tot][0]=R[tot][0]=pos[tot][0]=x,L[tot][1]=R[tot][1]=pos[tot][1]=y;
return tot;
}
void rebuild(int &now,int ins)
{
cnt=0,era(now),num[++cnt]=ins;
build(now,1,cnt,0);
}
void Insert(int &now,int ins,int k)
{
if(!now) {now=ins;return;}
if(pos[ins][k]<pos[now][k])
{
if((siz[ls]+1)*1.0>siz[now]*alpha) rebuild(now,ins);
else Insert(ls,ins,k^1);
}
else
{
if((siz[rs]+1)*1.0>siz[now]*alpha) rebuild(now,ins);
else Insert(rs,ins,k^1);
}
updata(now);
}
bool ckin(int now)
{
return ql[0]<=L[now][0]&&qr[0]>=R[now][0]&&ql[1]<=L[now][1]&&qr[1]>=R[now][1];
}
bool ckout(int now)
{
return qr[0]<L[now][0]||ql[0]>R[now][0]||qr[1]<L[now][1]||ql[1]>R[now][1];
}
bool ckp(int now)
{
return ql[0]<=pos[now][0]&&pos[now][0]<=qr[0]&&ql[1]<=pos[now][1]&&pos[now][1]<=qr[1];
}
int query(int now)
{
if(!now) return 0;
if(ckin(now)) return sum[now];
if(ckout(now)) return 0;
return (ckp(now)?val[now]:0)+query(ls)+query(rs);
}
#define beecute 233
int main()
{
int n=read(),op,x,y,A,las=0;
while(beecute)
{
op=read();
if(op==1) x=read()^las,y=read()^las,A=read()^las,Insert(root,New(x,y,A),0);
else if(op==2) ql[0]=read()^las,ql[1]=read()^las,qr[0]=read()^las,qr[1]=read()^las,printf("%d\n",las=query(root));
else break;
}
return 0;
}

2019.2.4

洛谷 P4148 简单题 解题报告的更多相关文章

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

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

  2. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  3. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  4. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  5. 洛谷 P1070 道路游戏 解题报告

    P1070 道路游戏 题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有\(n\)个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依 ...

  6. 洛谷 P2056 [ZJOI2007]捉迷藏 解题报告

    P2056 [ZJOI2007]捉迷藏 题目描述 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由\ ...

  7. 洛谷 P2664 树上游戏 解题报告

    P2664 树上游戏 题目描述 \(\text{lrb}\)有一棵树,树的每个节点有个颜色.给一个长度为\(n\)的颜色序列,定义\(s(i,j)\) 为 \(i\) 到 \(j\) 的颜色数量.以及 ...

  8. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  9. 洛谷 P1136 迎接仪式 解题报告

    P1136 迎接仪式 题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出&q ...

随机推荐

  1. python打印列表的下标和值的例子:

    python打印列表的下标和值的例子: In [1]: list01=[1,4,5] In [10]: def funct01(ll):   ....:     for index,value in ...

  2. 【JVM.12】线程安全与锁优化

    一.概述 面向过程的编程思想极大地提升了现代软件开发的生产效率和软件可以达到的规模,但是现实世界与计算机世界之间不可避免地存在一些差异,本节就如何保证并发的正确性和如何实现线程安全讲起. 二.线程安全 ...

  3. C#_Math函数总结

    Math.abs() 计算绝对值. Math.acos() 计算反余弦值. Math.asin() 计算反正弦值. Math.atan() 计算反正切值. Math.atan2() 计算从x 坐标轴到 ...

  4. 图像数据增强 (Data Augmentation in Computer Vision)

    1.1 简介 深层神经网络一般都需要大量的训练数据才能获得比较理想的结果.在数据量有限的情况下,可以通过数据增强(Data Augmentation)来增加训练样本的多样性, 提高模型鲁棒性,避免过拟 ...

  5. Linux系统下CPU使用(load average)梳理

    在平时的运维工作中,当一台服务器的性能出现问题时,通常会去看当前的CPU使用情况,尤其是看下CPU的负载情况(load average).对一般的系统来说,根据cpu数量去判断.比如有2颗cup的机器 ...

  6. Mysql双主热备+LVS+Keepalived高可用操作记录

    MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负 ...

  7. 浏览器数据库 IndexedDB 入门

    一.概述 随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据. 现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的 ...

  8. 先埋锅-CF-Valid BFS?-差一点没交上

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  9. Stanford Word Segmenter的特定领域训练

    有没有人自己训练过Stanford Word Segmenter分词器,因为我想做特定领域的分词,但在使用Stanford Word Segmenter分词的时候发现对于我想做的领域的一些词分词效果并 ...

  10. 个人博客作业-Week7

    团队任务中个人感想 我们团队选的题目是爬虫, 采用用AVA平台开发了, 我原来JAVA语言不熟悉了, PM考虑这部分之后分配任务这部分感觉很多谢 团队当中的PM很清楚每个组员的力量, 所以PM跟每个组 ...