传送门: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 + 10;
const int mod = 1e9+7;# define FO_OPEN 0
# define RG register
# define ST staticinline 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[2], mi[2], mx[2], l, r;ll v, s;friend bool operator == (node a, node b) {return a.d[0] == b.d[0] && a.d[1] == b.d[1];}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].rstruct KDT {node T[M], tmp;int siz, rt;inline void set() {siz = rt = 0;}inline void up(int x) {for (int i=0; i<2; ++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[0] = T[x].mi[0] = T[x].mx[0] = tmp.d[0];T[x].d[1] = T[x].mi[1] = T[x].mx[1] = tmp.d[1];}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^1);else insert(rs, d^1);up(x);} inline ll query(int x, int x1, int y1, int x2, int y2) {if(!x) return 0;ll ret = 0;if(in(x1, y1, x2, y2, T[x].mi[0], T[x].mi[1], T[x].mx[0], T[x].mx[1])) return T[x].s;if(out(x1, y1, x2, y2, T[x].mi[0], T[x].mi[1], T[x].mx[0], T[x].mx[1])) return 0;if(in(x1, y1, x2, y2, T[x].d[0], T[x].d[1], T[x].d[0], T[x].d[1])) 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 0;int mid = l+r>>1;D = d; nth_element(t+l, t+mid, t+r+1);T[mid] = t[mid];T[mid].l = rebuild(l, mid-1, d^1);T[mid].r = rebuild(mid+1, r, d^1);up(mid);return mid;}
}T;# undef ls
# undef rsint REBUILD_SIZE = 5000;int main() {scanf("%*d"); T.set();int opt, x1, y1, x2, y2;while(1) {scanf("%d", &opt); if(opt == 3) break;if(opt == 1) {scanf("%d%d%d", &x1, &y1, &x2);T.tmp.d[0] = T.tmp.mx[0] = T.tmp.mi[0] = x1;T.tmp.d[1] = T.tmp.mx[1] = T.tmp.mi[1] = y1;T.tmp.v = x2, T.tmp.s = x2;T.insert(T.rt, 0);if(T.siz == REBUILD_SIZE) {for (int i=1; i<=T.siz; ++i) t[i] = T.T[i];T.rt = T.rebuild(1, T.siz, 0);REBUILD_SIZE += 5000;}}if(opt == 2) {scanf("%d%d%d%d", &x1, &y1, &x2, &y2);printf("%lld\n", T.query(T.rt, x1, y1, x2, y2));}}return 0;
}

View Code

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 + 10;
const int mod = 1e9+7;# define RG register
# define ST staticinline ll read() {ll x = 0, f = 1; char ch = getchar();while(!isdigit(ch)) {if(ch == '-') f = -1;ch = getchar();}while(isdigit(ch)) {x = x*10+ch-'0';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[2], mx[2], mi[2], l, r;ll v, s;friend bool operator == (node a, node b) {return a.d[0] == b.d[0] && a.d[1] == b.d[1];}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].rnode tmp;
struct KDTree {node T[M];int rt, siz;inline void set() {siz = 0; rt = 0;}inline void up(int x) {for (int i=0; i<2; ++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[0] = T[x].mi[0] = T[x].mx[0] = tmp.d[0];T[x].d[1] = T[x].mi[1] = T[x].mx[1] = tmp.d[1];}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^1);else insert(rs, d^1);up(x);}inline ll query(int x, int x1, int y1, int x2, int y2) {if(!x) return 0ll;ll ret = 0;if(in(x1, y1, x2, y2, T[x].mi[0], T[x].mi[1], T[x].mx[0], T[x].mx[1])) return T[x].s;if(out(x1, y1, x2, y2, T[x].mi[0], T[x].mi[1], T[x].mx[0], T[x].mx[1])) return 0ll;if(in(x1, y1, x2, y2, T[x].d[0], T[x].d[1], T[x].d[0], T[x].d[1])) 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 0;int mid = l+r>>1; D = d;nth_element(t+l, t+mid, t+r+1);T[mid] = t[mid];T[mid].l = rebuild(l, mid-1, d^1);T[mid].r = rebuild(mid+1, r, d^1);up(mid);return mid;}
}T;# undef ls
# undef rsint REBUILD_SIZE = 10000;int main() {int opt, x1, y1, x2, y2;T.set();ll lst = 0;scanf("%*d");while(1) {opt = read();if(opt == 3) break;if(opt == 1) {x1 = read() ^ lst, y1 = read() ^ lst, x2 = read() ^ lst;tmp.d[0] = x1, tmp.d[1] = y1, tmp.v = tmp.s = x2;T.insert(T.rt, 0);if(T.siz == REBUILD_SIZE) {for (int i=1; i<=T.siz; ++i) t[i] = T.T[i];T.rt = T.rebuild(1, T.siz, 0); REBUILD_SIZE += 10000;}}if(opt == 2) {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 0;
}

View Code

转载于:https://www.cnblogs.com/galaxies/p/bzoj2683.html

bzoj2683/4066 简单题相关推荐

  1. BZOJ 4066: 简单题

    4066: 简单题 Time Limit: 50 Sec  Memory Limit: 20 MB Submit: 2373  Solved: 622 [Submit][Status][Discuss ...

  2. BZOJ 4066 简单题 ——KD-Tree套替罪羊树

    [题目分析] 直接x,y二维轮番划分,暴力即可. 套上替罪羊,打碎重构,对于时间复杂度有了保证. 写起来好麻烦,重构的技巧很棒! [代码] #include <cstdio> #inclu ...

  3. bzoj2683:简单题(树状数组套CDQ分分治)

    CDQ(陈丹琦)分治 CDQ显然是一个人的名字(2008NOI金牌选手陈丹琦) 这种离线的分治算法在算法界被称为"CDQ分治".  首先回忆一下归并排序的分治, 它的操作是将数组二 ...

  4. HDU 排名(简单题)

    好久没在oj上做题了,刚开始第二天做一道简单题的心得记录. 1 #include <cstdio> 2 #include <cstring> 3 #include <st ...

  5. (每日一题)CF1139D Steps to One 2021年天梯赛 L3-3 可怜的简单题(期望,莫比乌斯反演,杜教筛)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 一周连考三门,人都没了 Weblink 2021年天梯赛 L3-3 可怜的简单题 CF1139D Pr ...

  6. 【bzoj2751】[HAOI2012]容易题(easy) 数论,简单题

    Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取 ...

  7. 小M的简单题(easy)

    小M的简单题(easy) 时间限制:3s 内存限制:128MB [题目描述] 小M是某知名高中的学生,有一天,他请他的n个同学吃苹果,同学们排成一行,且手中已经有一些苹果.为了表示他的大方,有时他会给 ...

  8. Loj 【CQOI 2006】简单题,mmp

    #10117. 「一本通 4.1 练习 2」简单题   题目描述 题目来源:CQOI 2006 有一个 nnn 个元素的数组,每个元素初始均为 000.有 mmm 条指令,要么让其中一段连续序列数字反 ...

  9. BZOJ4066: 简单题

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

最新文章

  1. matlab clabel函数用法,CLabel的用法 | 学步园
  2. Android开发常用第三方平台
  3. NTU课程笔记 mas714复习:例题
  4. MySql中怎样使用case-when实现判断查询结果返回
  5. linux下安装win xp 进pe出错,PE安装原版XP系统(含高版本PE安装选项灰色处理办法)...
  6. Linux C语言结构体
  7. ajax省市二级联动硬编码,AJAX请求接受硬编码的JSON,但不接受软编码
  8. python字典嵌套字典的情况下获取某个key的value
  9. 心酸!苹果自研5G芯片最快2022年推出 首款5G iPhone还得靠高通
  10. 错误-trustAnchors参数必须为非空
  11. 【复习+知识补充】EL表达式:只能调用静态方法
  12. OMEA Pro,刚刚荣获15届Jolt大奖,综合RSS阅读,邮件、任务等管理的IIM(智能信息管理)...
  13. 计算机硬件现状及发展,计算机硬件的发展历史以及计算机的现状和发展趋势
  14. 如何用计算机抽奖,怎么用PPT制作随机点名抽奖
  15. 谷歌 Chrome 浏览器 隐藏标题 缩小标签页
  16. 计算机内存不足提示栻框,【计算机】CIMS概论6.ppt
  17. Unity属性(Attributes)
  18. 路由器和计算机的功能有何不同,网关和路由器的区别是什么 两者又有什么不同...
  19. 在salesforce中实现鼠标悬停显示提示框效果,并对显示框内容进行微缩页面布局
  20. 应用测试一(烤地瓜)——> 隐藏数据

热门文章

  1. c语言程序代码有什么用,用c语言编写的代码程序是什么?
  2. 雷军:天使投资人不是上帝只是配角
  3. 数控加工零件工艺性分析
  4. win8计算机可用内存不足,win8电脑运行提示物理内存不足的解决方法
  5. swift 判断是否设置了代理
  6. 高等数学:第五章 定积分(1)概念与性质 中值定理 微积分基本公式
  7. excel 如何去除两列重复项
  8. 【附源码】Python计算机毕业设计社区志愿者管理系统
  9. 神秘网络蠕虫不搞破坏却让几万台服务器抵抗木马
  10. web安全之Webshell管理工具