传送门: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. Spring+Hiberate 多数据源的网文整理

    解决方案: http://www.th7.cn/Program/java/2011/10/23/44664.shtml 分析共享Spring配置数据源四种方式(附相应jar包)  :http://ww ...

  2. 一个关于sql更新的小笔记

    一直在sqlserver下写东西,突然用mysql有些语法发生了改变,有点折腾 (MS SQL Server)语句:update A set  a.Name =   b.Name   from   A ...

  3. Qt Qwdget 汽车仪表知识点拆解1 速度表示

    先贴上效果图,注意,没有写逻辑,所以这些都是乱动的 这里线主要说一下中间显示速度的显示制作的方式,在这里,自己专门写了一个数字的仪表 考虑的一般的汽车是没有办法把瞬时速度提升到四位数的,所以我这里就放 ...

  4. 第十二篇 Python函数之全局变量&局部变量&递归函数

    全局变量:在定义的时候,顶头写的,没有任何缩进的变量就是全局变量. 全局变量的特点:在当前文件里的任何地方都可以进行调用 局部变量:在子程序里定义的变量,就是局部变量. 子程序:比如.py文件里,写的 ...

  5. 孤荷凌寒自学python第七十三天开始写Python的第一个爬虫3

    孤荷凌寒自学python第七十三天开始写Python的第一个爬虫3 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...

  6. Python目录链接

    第1章 就这么愉快的开始吧 课时1:我和python的第一次亲密接触 一.Python3的下载与安装 二.从IDIE启动Python 三.尝试点新的东西 四.为什么会这样? 五.课时01课后习题及答案 ...

  7. LeetCode 86 ——分隔链表

    1. 题目 2. 解答 从前向后遍历链表,将结点值小于 x 的结点放入到新链表 1 中,将结点值大于等于 x 的结点放入新链表 2 中.最后,将新链表 2 拼接在新链表 1 后面即可. /** * D ...

  8. HDU 4010 Query on The Trees(动态树LCT)

    Problem Description We have met so many problems on the tree, so today we will have a query problem ...

  9. C++STL——map

    一.相关定义 map 关联容器,存储相结合形成的一个关键值和映射值的元素 提供一对一(第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可以称为该关键字的值)的数据处理能力 map对象是模 ...

  10. android http

    在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端.它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET ...