#6034. 「雅礼集训 2017 Day2」线段游戏

内存限制:256 MiB时间限制:1000 ms标准输入输出
题目类型:传统评测方式:Special Judge
上传者: 匿名

提交提交记录统计讨论测试数据

题目描述

给出若干条线段,用 (x1,y2),(x2,y2) (x_1, y_2), (x_2, y_2)(x​1​​,y​2​​),(x​2​​,y​2​​) 表示其两端点坐标,现在要求支持两种操作:

  • 0 x1 y1 x2 y2 表示加入一条新的线段 (x1,y2),(x2,y2) (x_1, y_2), (x_2, y_2)(x​1​​,y​2​​),(x​2​​,y​2​​);
  • 1 x0 询问所有线段中,x xx 坐标在 x0 x_0x​0​​ 处的最高点的 y yy 坐标是什么,如果对应位置没有线段,则输出 0 00。

输入格式

第一行两个正整数 n nn、m mm 为初始的线段个数和操作个数。
接下来 n nn 行,每行四个整数,表示一条线段。
接下来 m mm 行,每行为一个操作 0 x1 y1 x2 y2 或 1 x0

输出格式

对于每一个询问操作,输出一行,为一个实数,当你的答案与标准答案误差不超过 10−2 10 ^ {-2}10​−2​​ 时,则视为正确。

样例

样例输入

3 4
0 -1 4 1
4 2 7 2
7 1 8 2
1 4
1 3
0 3 3 6 3
1 3

样例输出

2
0.5
3

对于线段树的每个节点,维护每个节点使得mid的值最大。对于不优的答案下传。查询时与标记永久化的查询类似。其实就是李超树。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<algorithm>
 7 #define maxn 100005
 8 using namespace std;
 9 inline int read() {
10     int x=0,f=1;char ch=getchar();
11     for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
12     for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
13     return x*f;
14 }
15 struct seg {double k,b;seg(){b=-10000000000000000;}}t[maxn*4];
16 inline double cal(seg now,int x) {return now.k*x+now.b;}
17 inline void work(int l,int r,int o,seg x) {
18     if(cal(t[o],l)>=cal(x,l)&&cal(t[o],r)>=cal(x,r)) {return;}
19     if(cal(t[o],l)<cal(x,l)&&cal(t[o],r)<cal(x,r)) {t[o]=x;return;}
20     int mid=(l+r)>>1,ls=o<<1,rs=ls+1;
21     if(cal(t[o],l)>=cal(x,l)&&cal(t[o],mid)<cal(x,mid)) {
22         seg tmp=t[o];t[o]=x;
23         work(l,mid,ls,tmp);
24         return;
25     }
26     if(cal(t[o],l)>=cal(x,l)&&cal(t[o],mid)>cal(x,mid)) {
27         if(l!=r) work(mid+1,r,rs,x);
28         return;
29     }
30     if(cal(t[o],l)<cal(x,l)&&cal(t[o],mid)<cal(x,mid)) {
31         seg tmp=t[o];t[o]=x;
32         if(l!=r) work(mid+1,r,rs,tmp);
33         return;
34     }
35     if(cal(t[o],l)<cal(x,l)&&cal(t[o],mid)>=cal(x,mid)) {
36         if(l!=r) work(l,mid,ls,x);
37         return;
38     }
39 }
40 inline void update(int l,int r,int o,int L,int R,seg x) {
41 //    cout<<l<<' '<<r<<endl;
42     if(L<=l&&R>=r) {work(l,r,o,x);return;}
43     int mid=(l+r)>>1,ls=o<<1,rs=ls+1;
44     if(L<=mid) update(l,mid,ls,L,R,x);
45     if(R>mid) update(mid+1,r,rs,L,R,x);
46 }
47 double ans;
48 inline double query(int l,int r,int o,int x) {
49     if(l==r) return cal(t[o],l);
50     int mid=(l+r)>>1,ls=o<<1,rs=ls+1;
51     if(x<=mid) return ans=max(ans,max(cal(t[o],x),query(l,mid,ls,x)));
52     else return ans=max(ans,max(cal(t[o],x),query(mid+1,r,rs,x)));
53 }
54 int n,m;
55 int main() {
56     n=read(),m=read();
57     for(int i=1;i<=n;i++) {
58         int x1=read(),y1=read(),x2=read(),y2=read();
59         if(x1>x2) {swap(x1,x2);swap(y1,y2);}
60         if(x2<1||x1>100000) continue;
61         seg x;
62         if(x1==x2) x.k=0,x.b=max(y1,y2);
63         else {
64             x.k=(double)(y2-y1)/(double)(x2-x1);
65             x.b=y1-x.k*x1;
66         }
67         update(1,100000,1,max(1,x1),min(100000,x2),x);
68     }
69     while(m--) {
70         int tp=read();
71         if(tp==0) {
72             int x1=read(),y1=read(),x2=read(),y2=read();
73             if(x1>x2) {swap(x1,x2);swap(y1,y2);}
74             if(x2<1||x1>100000) continue;
75             seg x;
76             if(x1==x2) x.k=0,x.b=max(y1,y2);
77             else {
78                 x.k=(double)(y2-y1)/(double)(x2-x1);
79                 x.b=y1-x.k*x1;
80             }
81             update(1,100000,1,max(1,x1),min(100000,x2),x);
82         }
83         else {
84             int x=read();ans=-10000000000000000;
85             query(1,100000,1,x);
86             printf("%.3lf\n",ans==-10000000000000000?0:ans);
87         }
88     }
89 }

View Code

 

转载于:https://www.cnblogs.com/wls001/p/9643019.html

#6034. 「雅礼集训 2017 Day2」线段游戏 李超树相关推荐

  1. 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

    值域线段树+势能线段树+扫描线 KiKi's K-Number ball The Child and Sequence 「雅礼集训 2017 Day1」市场 Atlantis KiKi's K-Num ...

  2. [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)

    [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿 ...

  3. #6029. 「雅礼集训 2017 Day1」市场(势能,区间除)

    #6029. 「雅礼集训 2017 Day1」市场 用线段树维护数列,区间上维护最大最小值,区间和还有标记,修改时,区间加直接做,而区间除时,递归到线段树上某一区间,如果这一操作等价于区间加(也就是最 ...

  4. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 -- 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  5. LibreOJ 6514. 「雅礼集训 2018 Day10」文明【虚树+LCA】

    6514. 「雅礼集训 2018 Day10」文明 [题目描述] 传送门 [题解] 考虑笨蛋的写法,可以用LCA求出1号和其他点的中点,然后DFS搜索Size大小即可,但是,复杂度显然要炸,但是我们会 ...

  6. 「雅礼集训 2018 Day2」农民

    传送门 Description 「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却发 ...

  7. 「6月雅礼集训 2017 Day2」B

    [题目大意] 求n*n的棋盘,每行每列都有2个黑格子的方案数. n<=10^7 [题解] zzq的做法好神奇啊 行列建点,二分图 左边有i个点,右边有j个点的方案数 f[i,j] 左边有i个点, ...

  8. LOJ#6044. 「雅礼集训 2017 Day8」共(Prufer序列)

    题面 传送门 题解 答案就是\(S(n-k,k)\times {n-1\choose k-1}\) 其中\(S(n,m)\)表示左边\(n\)个点,右边\(m\)个点的完全二分图的生成树个数,它的值为 ...

  9. LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)

    题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...

最新文章

  1. 124页,UC伯克利大学胡戎航博士论文公布:视觉与语言推理的结构化模型
  2. ajax跨域,这应该是最全的解决方案了
  3. 【论文学习】RepVGG: Making VGG-style ConvNets Great Again及网络重参数化的用途及效果分析
  4. java 封装表单数据类型_Java基本数据类型与封装类型详解(int和Integer区别)
  5. CodePlex关闭,建议迁移至GitHub
  6. 京解之才——2019年技术盘点微服务篇(三)| 程序员硬核评测
  7. 鸿蒙系统手机现在有什么,华为鸿蒙手机迟迟未来 手机操作系统面临的难点有哪些...
  8. Spark项目实践--基于 TMDB 数据集的电影数据分析
  9. CS61B 学习指南
  10. 计算机图形和ps的区别,PS CC和PS CC有什么区别?
  11. 调色盘——将真彩色图像降级为低分辨率图像的八叉树算法
  12. [C#复习向整合]反射 -Assembly与Activator
  13. filebeat7.7.0相关详细配置预览- processors - add_fields
  14. 深入解析SQL Server 2008
  15. man手册中文版设置
  16. unity17——布料插件制作旗子飘动效果
  17. [014量化交易] python 通过tushare 获取股票数据、名称、股票代码、指定股票名
  18. 为什么计算机中的负数要用补码表示?
  19. 保姆级教学如何在Ubuntu 20.04工作站上配置深度学习环境
  20. 弥勒“甘丝蜜朵”旅游地产策划规划方案

热门文章

  1. 常用的免费Webservice接口(二)
  2. 绑定控件中%#Eval()%和%=变量%的执行顺序
  3. ReportViewer教程(15)-矩阵报表-4
  4. C# 或Asp.Net 将excel表格导入数据库
  5. 破解keil 2k限制,注册码生成
  6. 传感器和单片机主板之间远距离通讯应该有哪些保障处理措施
  7. 计算机python是什么意思_系统学习python-1.1什么是计算机
  8. python关于二手房的课程论文_python之数据清理-以二手房信息为例
  9. linux 格式化u盘_【Ventoy】一个U盘,启动多个系统
  10. 深度学习的实用层面 —— 1.8 其它正则化方法