传送门: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. kettle 遇到 解决Incorrect integer value: '' for column 'id' at row 1 完美解决-费元星

    最近自己在测试一个开源的程序,测试中发现.该程序都添加和更新的时候回出现 Incorrect integer value: '' for column 'id' at row 1类是的错误! 后来我自 ...

  2. PHP批量替换MySql数据库中的数据内容

    <?php //替换数据库内容类 class replace{ public $dbAddress; //数据库地址 public $dbUser; //数据库用户名 public $dbPwd ...

  3. Oracle physical dataguard with broker部署

    一.环境说明 主库:10.110.96.88 备库:10.110.96.87 数据库实例:gisc 二.主库操作 1.开启force logging ALTER DATABASE FORCE LOGG ...

  4. Java日志(一):log4j与.properties配置文件

    日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录,在Apache网站jakarta.apache.org/log4j可以免费下载到Log4j ...

  5. 「暑期训练」「Brute Force」 Restoring Painting (CFR353D2B)

    题意 给定一定条件,问符合的矩阵有几种. 分析 见了鬼了,这破题谁加的brute force的标签,素质极差.因为范围是1e5,那你平方(枚举算法)的复杂度必然爆. 然后你就会思考其中奥妙无穷的数学规 ...

  6. Qt HUD(平显)演示程序绿色版

    把一个黑底白字的程序改成黑底绿字 上对比图,左侧是原本,右侧是仿造,有些地方比例还是有问题 其实这个程序没有啥技术含量,就是画 #include "mainwindow.h" #i ...

  7. CentOs 版本名字说明

    What images are in this directory CentOS-6.3-x86_64-netinstall.iso This is the network install and r ...

  8. (原创)白话KMP算法(续)

    第二章:KMP改良算法 第一章里面我们讲完了KMP算法的next数组实现法,回忆一下其实最重要的内容无非就是一.理解 i 指针无用回溯的意义,二.理解 j 指针的定位和模式串中每个元素重复度的关系,三 ...

  9. erc20代币合约

    看这篇文章需要对以太坊,智能合约,代币等概念有基本的了解. 什么是ERC20 可以把ERC20简单理解成以太坊上的一个代币协议,所有基于以太坊开发的代币合约都遵守这个协议.遵守这些协议的代币我们可以认 ...

  10. vim使用注意事项

    vim使用注意事项 1. 中文编码的问题 中文编码有很多,如果文件与vim的终端界面使用的编码不同,那么在vim显示的文件内容将会是一堆乱码. 2. 语系编码转换 命令iconv可以将语系编码进行转换 ...