bzoj2683/4066 简单题
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2683
http://www.lydsy.com/JudgeOnline/problem.php?id=4066
【题解】
学习了一发kdtree
感觉十分神奇
用一个类似于平衡树的来维护平面。
然后由于可能出现复杂度退化,大约10000个点就重构一次。
我这么傻逼把nth_element(...)的t+l打成t+1也是没谁了。。。
upd: 5/5又写了一遍怎么又达成+1了啊。。。。。。。
nth_element(t+l, t+mid, t+r+1);
2683:
# include <stdio.h>
# include <string.h>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 2e5 + ;
const int mod = 1e9+; # define FO_OPEN
# define RG register
# define ST static inline void gmin(int &x, int y) {if(x > y) x = y;}
inline void gmax(int &x, int y) {if(x < y) x = y;} inline bool in(int x1, int y1, int x2, int y2, int xx1, int yy1, int xx2, int yy2) {
return x1 <= xx1 && xx2 <= x2 && y1 <= yy1 && yy2 <= y2;
} inline bool out(int x1, int y1, int x2, int y2, int xx1, int yy1, int xx2, int yy2) {
return x1 > xx2 || x2 < xx1 || y1 > yy2 || y2 < yy1;
} int D;
struct node {
int d[], mi[], mx[], l, r;
ll v, s;
friend bool operator == (node a, node b) {
return a.d[] == b.d[] && a.d[] == b.d[];
}
friend bool operator < (node a, node b) {
return a.d[D] < b.d[D];
}
}t[M]; # define ls T[x].l
# define rs T[x].r struct KDT {
node T[M], tmp;
int siz, rt;
inline void set() {
siz = rt = ;
}
inline void up(int x) {
for (int i=; i<; ++i) {
T[x].mx[i] = T[x].mi[i] = T[x].d[i];
if(ls) gmin(T[x].mi[i], T[ls].mi[i]);
if(rs) gmin(T[x].mi[i], T[rs].mi[i]);
if(ls) gmax(T[x].mx[i], T[ls].mx[i]);
if(rs) gmax(T[x].mx[i], T[rs].mx[i]);
}
T[x].s = T[x].v + T[ls].s + T[rs].s;
}
inline void insert(int &x, int d) {
if(!x) {
x = ++siz;
T[x].d[] = T[x].mi[] = T[x].mx[] = tmp.d[];
T[x].d[] = T[x].mi[] = T[x].mx[] = tmp.d[];
}
if(T[x] == tmp) {
T[x].v += tmp.v;
T[x].s += tmp.v;
return ;
}
if(tmp.d[d] < T[x].d[d]) insert(ls, d^);
else insert(rs, d^);
up(x);
}
inline ll query(int x, int x1, int y1, int x2, int y2) {
if(!x) return ;
ll ret = ;
if(in(x1, y1, x2, y2, T[x].mi[], T[x].mi[], T[x].mx[], T[x].mx[])) return T[x].s;
if(out(x1, y1, x2, y2, T[x].mi[], T[x].mi[], T[x].mx[], T[x].mx[])) return ;
if(in(x1, y1, x2, y2, T[x].d[], T[x].d[], T[x].d[], T[x].d[])) ret += T[x].v;
return query(ls, x1, y1, x2, y2) + query(rs, x1, y1, x2, y2) + ret;
}
inline int rebuild(int l, int r, int d) {
if(l>r) return ;
int mid = l+r>>;
D = d; nth_element(t+l, t+mid, t+r+);
T[mid] = t[mid];
T[mid].l = rebuild(l, mid-, d^);
T[mid].r = rebuild(mid+, r, d^);
up(mid);
return mid;
}
}T; # undef ls
# undef rs int REBUILD_SIZE = ; int main() {
scanf("%*d"); T.set();
int opt, x1, y1, x2, y2;
while() {
scanf("%d", &opt); if(opt == ) break;
if(opt == ) {
scanf("%d%d%d", &x1, &y1, &x2);
T.tmp.d[] = T.tmp.mx[] = T.tmp.mi[] = x1;
T.tmp.d[] = T.tmp.mx[] = T.tmp.mi[] = y1;
T.tmp.v = x2, T.tmp.s = x2;
T.insert(T.rt, );
if(T.siz == REBUILD_SIZE) {
for (int i=; i<=T.siz; ++i) t[i] = T.T[i];
T.rt = T.rebuild(, T.siz, );
REBUILD_SIZE += ;
}
}
if(opt == ) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
printf("%lld\n", T.query(T.rt, x1, y1, x2, y2));
}
}
return ;
}
4066:
# include <cctype>
# include <stdio.h>
# include <string.h>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 2e5 + ;
const int mod = 1e9+; # define RG register
# define ST static inline ll read() {
ll x = , f = ; char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') f = -;
ch = getchar();
}
while(isdigit(ch)) {
x = x*+ch-'';
ch = getchar();
}
return x*f;
} inline void gmax(int &x, int y) {
if(x < y) x = y;
}
inline void gmin(int &x, int y) {
if(x > y) x = y;
} inline bool in(int x1, int y1, int x2, int y2, int xx1, int yy1, int xx2, int yy2) {
return x1 <= xx1 && xx2 <= x2 && y1 <= yy1 && yy2 <= y2;
} inline bool out(int x1, int y1, int x2, int y2, int xx1, int yy1, int xx2, int yy2) {
return x1 > xx2 || x2 < xx1 || y1 > yy2 || y2 < yy1;
} int D;
struct node {
int d[], mx[], mi[], l, r;
ll v, s;
friend bool operator == (node a, node b) {
return a.d[] == b.d[] && a.d[] == b.d[];
}
friend bool operator < (node a, node b) {
return a.d[D] < b.d[D];
}
}t[M]; # define ls T[x].l
# define rs T[x].r node tmp;
struct KDTree {
node T[M];
int rt, siz;
inline void set() {
siz = ; rt = ;
}
inline void up(int x) {
for (int i=; i<; ++i) {
T[x].mi[i] = T[x].mx[i] = T[x].d[i];
if(ls) gmin(T[x].mi[i], T[ls].mi[i]);
if(rs) gmin(T[x].mi[i], T[rs].mi[i]);
if(ls) gmax(T[x].mx[i], T[ls].mx[i]);
if(rs) gmax(T[x].mx[i], T[rs].mx[i]);
}
T[x].s = T[x].v + T[ls].s + T[rs].s;
}
inline void insert(int &x, int d) {
if(!x) {
x = ++siz;
T[x].d[] = T[x].mi[] = T[x].mx[] = tmp.d[];
T[x].d[] = T[x].mi[] = T[x].mx[] = tmp.d[];
}
if(tmp == T[x]) {
T[x].v += tmp.v;
T[x].s += tmp.v;
return ;
}
if(tmp.d[d] < T[x].d[d]) insert(ls, d^);
else insert(rs, d^);
up(x);
}
inline ll query(int x, int x1, int y1, int x2, int y2) {
if(!x) return 0ll;
ll ret = ;
if(in(x1, y1, x2, y2, T[x].mi[], T[x].mi[], T[x].mx[], T[x].mx[])) return T[x].s;
if(out(x1, y1, x2, y2, T[x].mi[], T[x].mi[], T[x].mx[], T[x].mx[])) return 0ll;
if(in(x1, y1, x2, y2, T[x].d[], T[x].d[], T[x].d[], T[x].d[])) ret += T[x].v;
ret += query(ls, x1, y1, x2, y2) + query(rs, x1, y1, x2, y2);
return ret;
}
inline int rebuild(int l, int r, int d) {
if(l>r) return ;
int mid = l+r>>; D = d;
nth_element(t+l, t+mid, t+r+);
T[mid] = t[mid];
T[mid].l = rebuild(l, mid-, d^);
T[mid].r = rebuild(mid+, r, d^);
up(mid);
return mid;
}
}T; # undef ls
# undef rs int REBUILD_SIZE = ; int main() {
int opt, x1, y1, x2, y2;
T.set();
ll lst = ;
scanf("%*d");
while() {
opt = read();if(opt == ) break;
if(opt == ) {
x1 = read() ^ lst, y1 = read() ^ lst, x2 = read() ^ lst;
tmp.d[] = x1, tmp.d[] = y1, tmp.v = tmp.s = x2;
T.insert(T.rt, );
if(T.siz == REBUILD_SIZE) {
for (int i=; i<=T.siz; ++i) t[i] = T.T[i];
T.rt = T.rebuild(, T.siz, );
REBUILD_SIZE += ;
}
}
if(opt == ) {
x1 = read() ^ lst, y1 = read() ^ lst, x2 = read() ^ lst, y2 = read() ^ lst;
lst = T.query(T.rt, x1, y1, x2, y2);
printf("%lld\n", lst);
}
}
return ;
}
bzoj2683/4066 简单题的更多相关文章
- [BZOJ2683][BZOJ4066]简单题
[BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...
- bzoj 4066: 简单题 kd-tree
4066: 简单题 Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 234 Solved: 82[Submit][Status][Discuss] De ...
- 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治
[BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...
- 【BZOJ2683】简单题 [分治][树状数组]
简单题 Time Limit: 50 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 你有一个N*N的棋盘,每个格子内有一 ...
- 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组
bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...
- 【BZOJ2683】简单题
cdq分治妙啊 (被改过题面的)原题: dydxh所出的题目是这样的:有一个N*N矩阵,给出一系列的修改和询问,修改是这样的:将(x,y)中的数字加上k,而询问是这样的:求(x1,y1)到(x2,y2 ...
- BZOJ 4066 简单题(KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支 ...
- bzoj 4066 简单题——KDtree(带重构)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 带部分重构的KDtree.就是那个替罪羊树思想的. 写了对拍,调了半天,发现忘了 re ...
- bzoj 4066: 简单题 K-D树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4066 题解 我们把每次的修改操作都当作二维平面上多了一个权值点 对于每组询问可以看做求一 ...
随机推荐
- 为什么说Objective-C是一门动态的语言?
object-c类的类型和数据变量的类型都是在运行是确定的,而不是在编译时确定.例如:多态特性,我们可以使用父类对象来指向子类对象,并且可以用来调用子类的方法.运行时(runtime)特性,我们可以动 ...
- 1,理解java中的IO
IO中的几种形式 基于字节:InputStream.OutputStream 基于字符:Writer.Reader 基于磁盘:File 基于网络Socket 最终都是字节操作,字符到字节要编码转换 ...
- 发布npm包 登录报错 E409 Conflict
1.到官网注册个账号,并且验证完邮箱:https://www.npmjs.com/ 2.打开cmd命令行 登录:$npm login 根据提示 一步步完成登录. 3.新建一个项目文件夹: npmtes ...
- Ubuntu下使用Git_2
接着上一篇的写,这里练习一下git clone 指令 指令格式 $ git clone <repository> <directory> <respository> ...
- linux学习总结---web前端③
css3: border-radius opacity: transform: 旋转 rotate 平移translate 缩放scale 扭曲skew transition:转变 强调:开始和结束 ...
- Leetcode 679.24点游戏
24点游戏 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: (8-4) ...
- linux备忘录-系统服务daemon
服务(daemon)及其分类 Linux中的服务被称为daemon(daemon是守护神,恶鬼的意思哦).这些daemon会常驻在内存当中,从而对我们的系统和任务等进行一些辅助性的工作.实际上,dae ...
- 学习bash——管道命令
摘要:管道命令概述.常见管道命令的使用(cut/grep.sort/wc/uniq.tee.tr/col/join/paste/expand.xargs.减号-) 一.概述 命令执行完会在屏幕上打印相 ...
- NO5——素数筛选
#include <stdio.h> int main() { ]={}; ;i<=;i++) a[i]=; ;i<=;i++) if(a[i]) ;j+=i) a[j]=; ...
- 第十三次ScrumMeeting会议
第十三次Scrum Meeting 时间:2017/12/1 地点:咖啡馆 人员:策划组美工组 名字 完成的工作 计划工作 蔡帜 完成公式的基本策划,Bug数量产生机制设计 科技树方面机制确定 游心 ...