传送门: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 简单题的更多相关文章

  1. [BZOJ2683][BZOJ4066]简单题

    [BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...

  2. bzoj 4066: 简单题 kd-tree

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

  3. 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治

    [BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...

  4. 【BZOJ2683】简单题 [分治][树状数组]

    简单题 Time Limit: 50 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 你有一个N*N的棋盘,每个格子内有一 ...

  5. 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组

    bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...

  6. 【BZOJ2683】简单题

    cdq分治妙啊 (被改过题面的)原题: dydxh所出的题目是这样的:有一个N*N矩阵,给出一系列的修改和询问,修改是这样的:将(x,y)中的数字加上k,而询问是这样的:求(x1,y1)到(x2,y2 ...

  7. BZOJ 4066 简单题(KD树)

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

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

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

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

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

随机推荐

  1. 玩转Node.js(四)-搭建简单的聊天室

    玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一 ...

  2. 基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上)

    基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上) 上周BOSS给分配任务让实现一下Mysql数据库的主从复制以及读写分离,然后花了一盏茶的功夫进行了调研,发现主从复制数据库进行一番 ...

  3. Android基本组件

    ①Activity和View负责与用户交互 ②Service通常位于后台,拥有独立的生命周期,为其他组件提供后台服务和监控其他组件运行状态 ③BroadcastReceiver广播消息接收器,类似事件 ...

  4. CentOS7安装配置SonarQube

    一.SonarQubeServer 1.前提 安装好mysql5.7和jdk1.8. (1)安装Mysql create user 'sonar'@'localhost' identified by ...

  5. Mybatis实例教程整体说明

    什么是mybatisMyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或 ...

  6. 剑指offer:从头到尾打印链表

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:从头到尾打印链表 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 首先题目实际给出的要求是返回ve ...

  7. sqlite sql语句关键字GROUP BY的理解

    第一遍看GROUP BY的介绍时,没看懂. SQLite 的 GROUP BY 子句用于与 SELECT 语句一起使用,来对相同的数据进行分组.在 SELECT 语句中,GROUP BY 子句放在 W ...

  8. zuoyebiji

  9. 【SSH】——使用ModelDriven的利与弊

    在以往的web开发中,如果要在表单显示什么内容,我们就需要在Action中提前定义好表单显示的所有属性,以及一系列的get和set方法.如果实体类的属性非常多,那么Action中也要定义相同的属性.在 ...

  10. Flink之状态之状态存储 state backends

    流计算中可能有各种方式来保存状态: 窗口操作 使用 了KV操作的函数 继承了CheckpointedFunction的函数 当开始做checkpointing的时候,状态会被持久化到checkpoin ...