LG P4148 简单题
\(\text{Code}\)
#include <cstdio>
#include <iostream>
#include <algorithm>
#define re register
using namespace std;
const int N = 2e5 + 5;
const double alpha = 0.725;
int n, cur, x0, y0, x1, y1, rt;
int L1[N], L2[N], R1[N], R2[N], siz[N], sum[N], ls[N], rs[N], ds[N], gs[N];
struct node{int x, y, v;}s[N];
inline bool cmpx(int a, int b){return s[a].x < s[b].x;}
inline bool cmpy(int a, int b){return s[a].y < s[b].y;}
inline void read(int &x)
{
x = 0; char ch = getchar();
while (!isdigit(ch)) ch = getchar();
while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
}
inline void update(int p, int o)
{
L1[p] = min(L1[p], L1[o]), R1[p] = max(R1[p], R1[o]);
L2[p] = min(L2[p], L2[o]), R2[p] = max(R2[p], R2[o]);
}
inline void maintain(int p)
{
siz[p] = siz[ls[p]] + siz[rs[p]] + 1, sum[p] = sum[ls[p]] + sum[rs[p]] + s[p].v;
L1[p] = R1[p] = s[p].x, L2[p] = R2[p] = s[p].y;
if (ls[p]) update(p, ls[p]); if (rs[p]) update(p, rs[p]);
}
int build(int l, int r)
{
if (l > r) return 0;
int mid = (l + r) >> 1;
double av1 = 0, av2 = 0, s1 = 0, s2 = 0;
for(re int i = l; i <= r; i++) av1 += s[gs[i]].x, av2 += s[gs[i]].y;
av1 /= (r - l + 1), av2 /= (r - l + 1);
for(re int i = l; i <= r; i++)
s1 += (av1 - s[gs[i]].x) * (av1 - s[gs[i]].x), s2 += (av2 - s[gs[i]].y) * (av2 - s[gs[i]].y);
if (s1 > s2) nth_element(gs + l, gs + mid, gs + r + 1, cmpx), ds[gs[mid]] = 1;
else nth_element(gs + l, gs + mid, gs + r + 1, cmpy), ds[gs[mid]] = 2;
ls[gs[mid]] = build(l, mid - 1), rs[gs[mid]] = build(mid + 1, r), maintain(gs[mid]);
return gs[mid];
}
void getseq(int p){if (!p) return; getseq(ls[p]), gs[++gs[0]] = p, getseq(rs[p]);}
inline void rebuild(int &p){gs[0] = 0, getseq(p), p = build(1, gs[0]);}
inline int bad(int p){return max(siz[ls[p]], siz[rs[p]]) >= siz[p] * alpha;}
void insert(int &p)
{
if (!p) return void(maintain(p = cur));
if (ds[p] == 1)
{
if (s[cur].x <= s[p].x) insert(ls[p]);
else insert(rs[p]);
}
else{
if (s[cur].y <= s[p].y) insert(ls[p]);
else insert(rs[p]);
}
maintain(p);
if (bad(p)) rebuild(p);
}
int query(int p)
{
if (!p || L1[p] > x1 || R1[p] < x0 || L2[p] > y1 || R2[p] < y0) return 0;
if (x0 <= L1[p] && R1[p] <= x1 && y0 <= L2[p] && R2[p] <= y1) return sum[p];
int res = 0;
if (s[p].x >= x0 && s[p].x <= x1 && s[p].y >= y0 && s[p].y <= y1) res = s[p].v;
return res + query(ls[p]) + query(rs[p]);
}
int main()
{
read(n);
for(int opt = -1, last = 0; opt != 3; )
{
read(opt);
if (opt == 1)
++cur, read(s[cur].x), read(s[cur].y), read(s[cur].v),
s[cur].x ^= last, s[cur].y ^= last, s[cur].v ^= last, insert(rt);
else if (opt == 2) read(x0), read(y0), read(x1), read(y1),
x0 ^= last, y0 ^= last, x1 ^= last, y1 ^= last, printf("%d\n", last = query(rt));
}
}
LG P4148 简单题的更多相关文章
- 洛谷 P4148 简单题 解题报告
P4148 简单题 题意 维护单点加与矩形求和,强制在线 说明 \(n\le 500000,m\le 200000\),\(4000ms / 20MB\) kd-tree 复杂度我不懂 是一颗平衡树, ...
- 洛谷 P4148 简单题 KD-Tree 模板题
Code: //洛谷 P4148 简单题 KD-Tree 模板题 #include <cstdio> #include <algorithm> #include <cst ...
- luogu P4148 简单题
传送门 这题真简单,直接把\(CDQ\)给ban掉了 其实数据范围比较小可以直接二维树状数组,我们看数据范围,发现点的个数比N还小,可以考虑用一些奇怪的数据结构 说的就是你,\(KD tree\) \ ...
- Luogu P4148 简单题(K-D Tree)
题面 题解 因为强制在线,所以我们不能$cdq$分治,所以考虑用$KDT$,$KDT$维护一个矩阵,然后询问的时候如果当前矩形在询问区间内,直接记贡献,否则判断当前点是否在矩阵内,然后左右分别递归下去 ...
- P4148 简单题(KDTree)
传送门 KDTree 修改权值当做插入节点,不平衡就暴力重构,询问的时候判断当前节点代表的矩形是否在询问的矩形的,是的话返回答案,相离返回0,否则的话判断当前点是否在矩形内,然后继续递归下去 //mi ...
- P4148 简单题 k-d tree
思路:\(k-d\ tree\) 提交:2次 错因:整棵树重构时的严重错误:没有维护父子关系(之前写的是假重构所以没有维护父子关系) 题解: 遇到一个新的点就插进去,如果之前出现过就把权值加上. 代码 ...
- BZOJ 2683: 简单题
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
- 【BZOJ-1176&2683】Mokia&简单题 CDQ分治
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- Bzoj4066 简单题
Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 2185 Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...
- Bzoj2683 简单题
Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1071 Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...
随机推荐
- day16 正则表达式 & 反射 & Java内存模型(JMM)
day16 class 1)获取一个类的所有信息(变量.方法.构造方法) 2)创建类对象newInstance() Field 1)访问变量或给变量赋值 Method 1)执行具体类对象的指定方法 3 ...
- 【zookeeper】Zookeeper相关概念、重难点(myid)、语法、使用、工具
1234567890 1请按照我是想额度插入fvtgb6yhn7ujm8ik,9ol.
- 12V转5V降压芯片,12V转3.3V稳压芯片电路图
12V转5V应用中,大多要求会输出电流高的,稳压LDO就不能满足了,需要使用DC-DC降压芯片来持续稳压5V,输出电流1000MA,2000MA,3000MA,5000MA等.不同的输出电流可以选择适 ...
- go-carbon 1.5.3 版本发布, 修复已知 bug 和新增俄罗斯语翻译文件
carbon 是一个轻量级.语义化.对开发者友好的golang时间处理库,支持链式调用. 目前已被 awesome-go 收录,如果您觉得不错,请给个star吧 github.com/golang-m ...
- 周结之json补充、正则re模块、hashlib模块、logging模块
周结 目录 周结 json补充 正则表达式 re模块 第三方模块的下载 request模块 办公自动化openpyxl模块 hashlib加密模块 subprocess模块 logging日志模块 j ...
- 二阶段目标检测网络-Mask RCNN 详解
ROI Pooling 和 ROI Align 的区别 Mask R-CNN 网络结构 骨干网络 FPN anchor 锚框生成规则 实验 参考资料 Mask RCNN 是作者 Kaiming He ...
- Django 连接各数据库配置汇总(sqlite3,MySql,Oracle)
在django中,默认配置的数据库是 sqlite3 # Database # https://docs.djangoproject.com/en/2.0/ref/settings/#database ...
- Vuex从入门到精通
一.vuex介绍 目标 什么是Vuex 为什么学习Vuex 通信方案 组件关系 数据通信 父子关系 父传子:props : 子传父:$emit 非父子关系 vuex (一种组件通信方案) Vuex是什 ...
- 聊一聊 SQLSERVER 的行不能跨页
一:背景 1. 讲故事 相信有很多朋友在学习 SQLSERVER 的时候都听说过这句话,但大多都是记忆为主,最近在研究 SQLSERVER,所以我们从 底层存储 的角度来深入理解下. 二:理解数据页 ...
- 那些年我们用过的组件-结构化日志组件 Serilog
什么是结构化日志 我们记录日志惯常使用 log4j2.NLog 等日志组件,这些组件提供了输出到多种终端的能力,但是大部分时候我们选择将日志输出到操作系统的文件系统中,为什么呢?至少有一部分原因是记录 ...