题目大意:有n个操作,要么在平面上增删一个点,要么询问某个坐标右上侧(严格大于等于)第一个点是谁(x相同取y最小)。

解:非常智障看错题了,没看到要在右上,所以写了个树套set,发现看错题嘀咕了一下艹这询问set搞不来,想了一下似乎kd-tree可以做,就写了棵,常数卡得很死过了。后来看题解还真是树套set。离散化后每个线段都是一个set,然后插入删除的时候沿途把set搞一下,询问的时候用个小技巧就行了,还是很简单的。

  1 #include <cstdio>
  2 #include <string>
  3 #include <iostream>
  4 #include <algorithm>
  5 #include <cmath>
  6 #include <cstring>
  7 #include <complex>
  8 #include <set>
  9 #include <vector>
 10 #include <map>
 11 #include <queue>
 12 #include <deque>
 13 #include <ctime>
 14
 15 using namespace std;
 16
 17 const double EPS = 1e-8;
 18
 19 #define ABS(x) ((x)<0?(-(x)):(x))
 20 #define SQR(x) ((x)*(x))
 21 #define MIN(a,b) ((a)<(b)?(a):(b))
 22 #define MAX(a,b) ((a)>(b)?(a):(b))
 23
 24 #define LSON(x) ((x)<<1)
 25 #define RSON(x) (((x)<<1)+1)
 26 #define LOWBIT(x) ((x)&(-(x)))
 27 #define MAXS 1111
 28 #define MAXN 222222
 29 #define VOIDPOINT 0
 30 #define LL long long
 31 #define OO 214748364
 32 #define INF 0x3f3f3f3f
 33 #define MP(x,y) make_pair(x,y)
 34
 35 int index;
 36
 37 struct node{
 38     int xy[2];
 39     node(int a = 0, int b = 0) {
 40         xy[0] = a; xy[1] = b;
 41     }
 42     bool operator < (const node &rhs) const {
 43         if (xy[index] == rhs.xy[index]) return xy[index^1] < rhs.xy[index^1];
 44         return xy[index] < rhs.xy[index];
 45     }
 46 };
 47
 48 char str[111];
 49
 50 struct ask{
 51     int type, x, y;
 52     void read() {
 53         scanf("%s %d %d", str, &x, &y);
 54         type = str[0] == 'a' ? 0 : (str[0] == 'r' ? 1 : 2);
 55     }
 56 } q[MAXN];
 57
 58 vector<pair<int, int > >lsh;
 59 node b[MAXN];
 60
 61 struct KDTREE{
 62     int lson[MAXN*4], rson[MAXN*4], size[MAXN*4], alive[MAXN*4];
 63     int minx[MAXN*4], maxx[MAXN*4], miny[MAXN*4], maxy[MAXN*4];
 64     node a[MAXN*4];
 65     int gx, gy, gz;
 66     void setting(int a = 0, int b = 0, int c = 0) {
 67         gx = a; gy = b; gz = c;
 68     }
 69     void build(int kok, int l, int r, int dep) {
 70         if (l > r) return ;
 71
 72         alive[kok] = size[kok] = 0;
 73         int mid = (l + r) >> 1;
 74         index = dep & 1;
 75
 76         nth_element(b + l, b + mid, b + r + 1);
 77         a[kok] = b[mid];
 78 //        cout << kok << ' ' << a[kok].xy[0] <<' '<< a[kok].xy[1] << endl;
 79
 80         build(LSON(kok), l, mid-1, dep+1);
 81         build(RSON(kok), mid+1, r, dep+1);
 82     }
 83     void insert(int kok = 1, int dep = 0) {
 84         ////cout << kok << ' '<< a[kok].xy[0] <<' '<< a[kok].xy[1] << endl;
 85         while (1) {
 86             size[kok] += gz;
 87             if (gx == a[kok].xy[0] && gy == a[kok].xy[1]) {
 88                 alive[kok] += gz;
 89                 return ;
 90             }
 91             index = dep & 1;
 92             ++dep;
 93             if (node(gx, gy) < a[kok]) kok = LSON(kok);//insert(LSON(kok), dep + 1);
 94             else kok = RSON(kok); //insert(RSON(kok), dep + 1);
 95         }
 96         //size[kok] = size[LSON(kok)] + alive[kok] + size[RSON(kok)];
 97     }
 98     pair<int, int > query(int kok = 1, int dep = 0) {
 99         if (size[kok] == 0) return MP(INF, INF);
100         index = dep & 1;
101         //        cout << kok << ' '<< a[kok].xy[0] <<' '<< a[kok].xy[1] << endl;
102         pair<int ,int > ans = MP(INF, INF);
103         if (index == 1) { //node(gx, gy) < a[kok] || gy == a[kok].xy[1] ? : MP(INF, INF)
104             if (size[RSON(kok)]) ans = query(RSON(kok), dep+1);
105             if (gy <= a[kok].xy[1] && size[LSON(kok)]) ans = min(ans, query(LSON(kok), dep+1));
106             if (alive[kok] && gx < a[kok].xy[0] && gy < a[kok].xy[1]) ans = min(ans, MP(a[kok].xy[0], a[kok].xy[1]));
107             return ans;
108         }
109         if (gx < a[kok].xy[0]) {
110             if (alive[kok] && gy < a[kok].xy[1]) ans = MP(a[kok].xy[0], a[kok].xy[1]);
111             if (size[LSON(kok)]) ans = min(ans, query(LSON(kok), dep+1));
112         }
113         if (ans.first == INF) {
114             if (size[RSON(kok)]) ans = query(RSON(kok), dep + 1);
115         }
116         //!!
117         return ans;
118     }
119 } Tree;
120
121 int n;
122
123 void init() {
124     scanf("%d", &n);
125     for (int i = 0; i < n; ++i) {
126         q[i].read();
127         lsh.push_back(MP(q[i].x, q[i].y));
128     }
129     sort(lsh.begin(), lsh.end());
130     lsh.erase(unique(lsh.begin(), lsh.end()), lsh.end());
131     for (int i = 0; i < lsh.size(); ++i) b[i] = node(lsh[i].first, lsh[i].second);
132     Tree.build(1, 0, lsh.size()-1, 0);
133 }
134
135 void solve() {
136     for (int tt = 0; tt < n; ++tt) {
137         if (q[tt].type == 0) {
138             //cout << q[tt].x << ' ' << q[tt].y << endl;
139             Tree.setting(q[tt].x, q[tt].y, 1);
140             Tree.insert();
141         } else if (q[tt].type == 1) {
142             Tree.setting(q[tt].x, q[tt].y, -1);
143             Tree.insert();
144         } else {
145             Tree.setting(q[tt].x, q[tt].y);
146             pair<int, int > ans = Tree.query();
147             if (ans.first == INF) puts("-1");
148             else printf("%d %d\n", ans.first, ans.second);
149         }
150     }
151 }
152
153 int main() {
154 //    freopen("test.txt", "r", stdin);
155     init();
156     solve();
157     return 0;
158 }

CF 19D

转载于:https://www.cnblogs.com/wmzisfoolish/p/5716358.html

CF 19D, 线段树套set/KD-tree相关推荐

  1. bzoj4605 崂山白花蛇草水 权值线段树套kd树

    Description Q次操作,要求资瓷 在(x,y)处放一个数字x 查询(x1,y1)到(x2,y2)矩形内第k大 Solution 非常裸的权值线段树套kd树,为了保证复杂度可以定期重构也可以平 ...

  2. 模板:二维线段树(线段树套线段树)

    文章目录 问题 解析 单点修改 询问 完整代码 标记永久化 代码 所谓二维线段树,就是有两个维度的线段树 (逃) 问题 给出一个矩形 要求支持以下操作: 1.询问一个子矩形的最值 2.修改某一个单点的 ...

  3. 【UOJ#388】【UNR#3】配对树(线段树,dsu on tree)

    [UOJ#388][UNR#3]配对树(线段树,dsu on tree) 题面 UOJ 题解 考虑一个固定区间怎么计算答案,把这些点搞下来建树,然后\(dp\),不难发现一个点如果子树内能够匹配的话就 ...

  4. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2271  Solved: 935 [Submit][St ...

  5. BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)

    我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...

  6. 【bzoj1146】 [CTSC2008]网络管理Network【树链剖分+树套树+二分 线段树套Treap】

    1146: [CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公 ...

  7. 崂山白花蛇草水 权值线段树套KDtree

    崂山白花蛇草水 权值线段树套KDtree Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻 ...

  8. bzoj4605: 崂山白花蛇草水 权值线段树套KDtree

    bzoj4605: 崂山白花蛇草水 链接 bzoj loj 思路 强制在线,那就权值线段树套KDtree好了,没啥好讲的. KDtree要加平衡因子来重构.另外,那水真难喝. 错误 树套树一边写过了, ...

  9. 【bzoj4605】崂山白花蛇草水 权值线段树套KD-tree

    题目描述 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了山东省省队,现在便是他履行诺言的时候了.蒟蒻Bob ...

最新文章

  1. STP:五种端口状态与角色 RSTP:3种端口状态与角色
  2. 12 条用于 Linux 的 MySQL/MariaDB 安全最佳实践
  3. WPF ControlTemplate TemplateBinding
  4. 【C语言】%[修饰符] 格式字符
  5. android merge的作用,Android学习手记-merge
  6. Linux文件系统管理命令(第二版)
  7. 2011年度最佳开源软件:Bossie奖结果公布
  8. ajax异步获取右侧html,Ajax异步获取html数据中包含js方法无效的解决方法
  9. 定时执行自动化脚本-(一)导入保存jmeter参数至文件的jar包
  10. p5.js之有趣的时钟(码绘2)
  11. 个人开发者上架Android应用市场感受
  12. 小学计算机教师业务笔记,小学教师业务笔记
  13. Oxffff转换成十进制
  14. 如何在virtualBox中安装MacOs教程
  15. MemoryAnalyze分析weblogic的phd文件
  16. android 开发快捷键,Android开发部分快捷键总结
  17. 《JSP网站开发技术》教学大纲
  18. 如何写好年终总结年终总结应该怎么写
  19. HR干货,怎样做好企业员工的晋升
  20. 软件测试-七项测试的基本原则

热门文章

  1. Android原生分屏,原生ROM都有分屏 为啥MIUI做了那么久?
  2. 电子协会 青少年软件编程等级考试 C语言历年真题
  3. 微信小程序倒计时实现
  4. php 源代码分离,迅睿CMS 网站安全权限划分
  5. 关于brainstorm的正确打开方式
  6. mysql中中文显示_MySQL显示中文
  7. opencv4.4百度网盘链接
  8. 2019-10-31-win10-uwp-访问解决方案文件
  9. mapbox-gl知识点整理
  10. c++如何判断质数/合数