BZOJ_3165_[Heoi2013]Segment_线段树
BZOJ_3165_[Heoi2013]Segment_线段树
Description
要求在平面直角坐标系下维护两个操作:
1.在平面上加入一条线段。记第i条被插入的线段的标号为i。
2.给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号。
Input
第一行一个整数n,表示共n 个操作。
接下来n行,每行第一个数为0或1。
若该数为 0,则后面跟着一个正整数 k,表示询问与直线
x = ((k +lastans–1)%39989+1)相交的线段中交点(包括在端点相交的情形)最靠上的线段的编号,其中%表示取余。若某条线段为直线的一部分,则视作直线与线段交于该线段y坐标最大处。若有多条线段符合要求,输出编号最小的线段的编号。
若该数为 1,则后面跟着四个正整数 x0, y0, x 1, y 1,表示插入一条两个端点为
((x0+lastans-1)%39989+1,(y0+lastans-1)%10^9+1)和((x
1+lastans-1)%39989+1,(y1+lastans-1)%10^9+1) 的线段。
其中lastans为上一次询问的答案。初始时lastans=0。
Output
对于每个 0操作,输出一行,包含一个正整数,表示交点最靠上的线段的编号。若不存在与直线相交的线段,答案为0。
Sample Input
1 8 5 10 8
1 6 7 2 6
0 2
0 9
1 4 7 6 7
0 5
Sample Output
0 3
HINT
对于100%的数据,1 ≤ n ≤ 10^5 , 1 ≤ k, x0, x1 ≤ 39989, 1 ≤ y0 ≤ y1 ≤ 10^9。
插入时找到线段树上对应log个完全包含的结点。
对于当前结点,如果完全更优或原来没有线段,就插入并返回,如果比当前完全更差也返回,否则向下递归。
查询时查一个点查到底即可。
插入复杂度:每次插入log个区间,递归过程相当于向下二分,于是复杂度O(lognlogn)
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 40050
#define M 39989
#define ls p<<1
#define rs p<<1|1
typedef double f2;
int n,ans,is[N<<2],xx[N<<2],yy[N<<2];
f2 Y,K[N<<2],lv[N<<2],rv[N<<2];
int id;
void insert(int l,int r,int a,int b,f2 k,int y,int p) {
int mid=(l+r)>>1;
if(a<=l&&b>=r) {
f2 lw=y+(l-a)*k,rw=y+(r-a)*k;
if(!is[p]||(lw>lv[p]&&rw>rv[p])) {
is[p]=id; lv[p]=lw; rv[p]=rw;
}else if(lw>lv[p]||rw>rv[p]) {
insert(l,mid,a,b,k,y,ls);
insert(mid+1,r,a,b,k,y,rs);
}
return ;
}else {
if(a<=mid) insert(l,mid,a,b,k,y,ls);
if(b>mid) insert(mid+1,r,a,b,k,y,rs);
}
}
void query(int l,int r,int k,int p) {
if(l==r) {
if(is[p]&&(lv[p]>Y||(lv[p]==Y&&ans>is[p]))) Y=lv[p],ans=is[p];
return ;
}
if(is[p]) {
f2 now=lv[p]+1.0*(rv[p]-lv[p])/(r-l)*(k-l);
if(now>Y||(now==Y&&ans>is[p])) Y=now,ans=is[p];
}
int mid=(l+r)>>1;
if(k<=mid) query(l,mid,k,ls);
else query(mid+1,r,k,rs);
}
int main() {
scanf("%d",&n);
int opt,x_1,y_1,x_2,y_2,i;
for(i=1;i<=n;i++) {
scanf("%d%d",&opt,&x_1);
x_1=(x_1+ans-1)%M+1;
if(opt==0) {
Y=-1e15; ans=0;
query(1,M,x_1,1);
printf("%d\n",ans);
}else {
id++;
scanf("%d%d%d",&y_1,&x_2,&y_2);
y_1=(y_1+ans-1)%1000000000+1;
x_2=(x_2+ans-1)%M+1;
y_2=(y_2+ans-1)%1000000000+1;
if(x_1>x_2) swap(x_1,x_2),swap(y_1,y_2);
f2 k; int y;
if(x_1==x_2) k=0,y=max(y_1,y_2);
else k=1.0*(y_2-y_1)/(x_2-x_1),y=y_1;
insert(1,M,x_1,x_2,k,y,1);
// printf("%d %d %d %d\n",x_1,y_1,x_2,y_2);
}
}
}
BZOJ_3165_[Heoi2013]Segment_线段树的更多相关文章
- bzoj 3165: [Heoi2013]Segment 线段树
题目: Description 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第i条被插入的线段的标号为i. 给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. ...
- 【BZOJ3165】[HEOI2013]Segment(李超线段树)
[BZOJ3165][HEOI2013]Segment(李超线段树) 题面 BZOJ 洛谷 题解 似乎还是模板题QwQ #include<iostream> #include<cst ...
- 李超线段树(segment[HEOI2013]-洛谷T4097)
(neng了好久好久才糊弄懂得知识点...) 一.李超线段树 在线动态维护一个二维平面直角坐标系, 支持插入一条线段, 询问与直线x = x0相交的所有线段中,交点y的最大/小值 (若有多条线段符合条 ...
- Luogu P4097 [HEOI2013]Segment 李超线段树
题目链接 \(Click\) \(Here\) 李超线段树的模板.但是因为我实在太\(Naive\)了,想象不到实现方法. 看代码就能懂的东西,放在这里用于复习. #include <bits/ ...
- 2019.02.11 bzoj3165: [Heoi2013]Segment(线段树)
传送门 题意简述:要求支持两种操作: 插入一条线段. 询问与直线x=kx=kx=k相交的线段中,交点最靠上的线段的编号. 思路: 直接上李超线段树即可. 代码: #include<bits/st ...
- BZOJ3165: [Heoi2013]Segment(李超线段树)
题意 题目链接 Sol 李超线段树板子题.具体原理就不讲了. 一开始自己yy着写差点写自闭都快把叉积搬出来了... 后来看了下litble的写法才发现原来可以写的这么清晰简洁Orz #include& ...
- 2018.07.23 洛谷P4097 [HEOI2013]Segment(李超线段树)
传送门 给出一个二维平面,给出若干根线段,求出x" role="presentation" style="position: relative;"&g ...
- 洛谷P4097 [HEOI2013]Segment(李超线段树)
题面 传送门 题解 调得咱自闭了-- 不难发现这就是个李超线段树,不过因为这里加入的是线段而不是直线,所以得把线段在线段树上对应区间内拆开之后再执行李超线段树的操作,那么复杂度就是\(O(n\log^ ...
- P4097 [HEOI2013]Segment 李超线段树
$ \color{#0066ff}{ 题目描述 }$ 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 给定一个数 k,询问与直线 x = k 相交的线 ...
随机推荐
- 17:不重复整数提取NoRepeatNum
题目描述 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数. 输入描述:输入一个int型整数 输出描述:按照从右向左的阅读顺序,返回一个不含重复数字的新的整数 输入例子: ...
- python学习(十二)模块
怎么一下子就来学了模块? 其实学了判断.循环.函数等知识就可以开始下水写程序了,不用在意其他的细节,等你用到的时候再回过头去看,此所谓囫囵吞枣学习法. 为啥学模块? 有点用的.或者有点规模的程序都是要 ...
- 06 php 单例模式
一:单例模式的三大原则 (1)构造函数需要标记为非public(防止外部使用new操作符创建对象),单例类不能在其他类中实例化,只能被自身实例化. (2)拥有一个保存类的实例的静态成员变量$_inst ...
- [项目构建 十一]babasport 购物车的原理及实现.
今天来开始写一下关于购物车的东西, 这里首先抛出四个问题: 1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还在吗? 2)用户登陆了用户名密码,添加商品, ...
- iOS --生产JSON格式,创建JSON文件,创建文件夹,指定储存
//生成json文件 - (void)onjson { // 如果数组或者字典中存储了 NSString, NSNumber, NSArray, NSDictionary, or NSNull ...
- TCP/IP状态详解
今天犯懒了,本来自己也做了一些相应的笔记,但是发现这篇写的更好一些,简单易懂,而且有图有真相,为了方便以后查看,在此转载了,在此基础上加了自己的笔记 TCP正常建立和关 ...
- Til the Cows Come Home(最短路模板题)
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Description Bessie is ...
- HTML 学习笔记 JQuery(盒子操作)
这边博客详细的讲述一下JQuery中关于盒子模型的一些方法 offset([coordinates])方法 获取匹配元素在当前适口的相对偏移 返回的对象包含两个模型属性:top和left 以像素计.此 ...
- 我的Android进阶之旅------>使用ThumbnailUtils类获取视频的缩略图
今天看了一段代码,是关于获取视频的缩略图的,让我认识了一个ThumbnailUtils类,代码如下. Bitmap bitmap = ThumbnailUtils.createVideoThumbna ...
- Wannafly挑战赛12 A 银行存款 【DP】【DFS】
链接:https://www.nowcoder.com/acm/contest/79/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...