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\), \(x1\), \(y1\),表示插入一条两个端点为 \(((x0+lastans-1) \% 39989+1\), \((y0+lastans-1) \%10^9+1)\) 和 \(((x1+lastans-1) \% 39989+1\) , \((y1+lastans-1) \%10^9+1)\) 的线段

其中 $lastans $ 为上一次询问的答案。初始时 \(lastans=0\)

Output

对于每个 \(0\) 操作,输出一行,包含一个正整数,表示交点最靠上的线段的编号。若不存在与直线相交的线段,答案为 \(0\)

Sample Input

6

1 8 5 10 8

1 6 7 2 6

0 2

0 9

1 4 7 6 7

0 5

Sample Output

2

0

3

HINT

对于 \(30\%\) 的数据,\(n \leq 1000\)

对于 \(100\%\) 的数据,\(1 \leq n \leq 10^5, 1 \leq k, x0, x1 \leq 39989, 1 \leq y0 , y1 \leq 10^9\)


题解

李超线段树模板题。

推荐一篇好的 \(blog\) : https://blog.csdn.net/flere825/article/details/76283734

很巧妙的思想。

关键点就是引入区间“最优势线段” & 动态维护它,保证对每一个位置,答案一定在包含这个位置的区间的“最优势线段”中。


代码

注意坑点!!!!!

\(y\) 的模数为 \(10^9\)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath> #define eps 1e-9
#define P 39989 using namespace std; int read(){
int x=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return x;
} const int N = 100005;
typedef double db; int tot;
db K[N],B[N];
struct node{
node *ch[2];
int id;
}pool[P*2],*root;
int cnt;
void build(node *p,int l,int r){
p->id=0;
if(l==r) return;
int mid=(l+r)>>1;
build(p->ch[0]=&pool[++cnt],l,mid);
build(p->ch[1]=&pool[++cnt],mid+1,r);
}
inline db cal(int x,int c) { return K[x]*c+B[x]; }
bool better(int x,int y,int c){
if(x==0) return false;
if(y==0) return true;
db cx=cal(x,c),cy=cal(y,c);
if(fabs(cx-cy)<eps) return x<y;
return cx>cy;
}
void insert(node *p,int l,int r,int L,int R,int c){
if(l==L && r==R){
int mid=(l+r)>>1;
if(better(c,p->id,mid)) swap(p->id,c);
int tl=better(p->id,c,l),tr=better(p->id,c,r);
if(!c || l==r || (tl && tr)) return;
if(tl) insert(p->ch[1],mid+1,r,mid+1,r,c);
else insert(p->ch[0],l,mid,l,mid,c);
return;
}
int mid=(l+r)>>1;
if(R<=mid) insert(p->ch[0],l,mid,L,R,c);
else if(L>mid) insert(p->ch[1],mid+1,r,L,R,c);
else {
insert(p->ch[0],l,mid,L,mid,c);
insert(p->ch[1],mid+1,r,mid+1,R,c);
}
}
int ans;
void query(node *p,int l,int r,int c){
ans = better(p->id,ans,c) ? p->id : ans ;
if(l==r) return;
int mid=(l+r)>>1;
if(c<=mid) query(p->ch[0],l,mid,c);
else query(p->ch[1],mid+1,r,c);
} int main()
{
int n,opt,lastans=0,k,x0,y0,x1,y1;
n=read(); root=&pool[++cnt];
build(root,1,P); while(n--){
opt=read();
if(opt==0){
k=(read()+lastans-1)%P+1;
ans=0;
query(root,1,P,k);
lastans=ans;
printf("%d\n",lastans);
}
else{
x0=(read()+lastans-1)%P+1; y0=(read()+lastans-1)%1000000000+1;
x1=(read()+lastans-1)%P+1; y1=(read()+lastans-1)%1000000000+1;
if(x0>x1) swap(x0,x1),swap(y0,y1);
tot++;
K[tot]=1.0*(y1-y0)/(x1-x0);
B[tot]=y0-K[tot]*x0;
insert(root,1,P,x0,x1,tot);
}
} return 0;
}

[洛谷P4097] [HEOI2013] Segment的更多相关文章

  1. 洛谷 P4097 [HEOI2013]Segment 解题报告

    P4097 [HEOI2013]Segment 题目描述 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 \(i\) 条被插入的线段的标号为 \(i\) 给定一个数 \(k\),询问 ...

  2. 2018.07.23 洛谷P4097 [HEOI2013]Segment(李超线段树)

    传送门 给出一个二维平面,给出若干根线段,求出x" role="presentation" style="position: relative;"&g ...

  3. 洛谷P4097 [HEOI2013]Segment(李超线段树)

    题面 传送门 题解 调得咱自闭了-- 不难发现这就是个李超线段树,不过因为这里加入的是线段而不是直线,所以得把线段在线段树上对应区间内拆开之后再执行李超线段树的操作,那么复杂度就是\(O(n\log^ ...

  4. 【洛谷P4097】Segment 李超线段树

    题目大意:维护一个二维平面,给定若干条线段,支持询问任意整数横坐标处对应的纵坐标最靠上的线段的 id,相同高度取 id 值较小的,强制在线. 题解:初步学习了李超线段树.李超线段树的核心思想在于通过标 ...

  5. 洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告

    P4100 [HEOI2013]钙铁锌硒维生素 题目描述 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加 宇宙比赛的饮食. 众所周知,前往宇宙的某个星球,通常要花费好长好长的时间, ...

  6. P4097 [HEOI2013]Segment(李超树)

    链接 https://www.luogu.org/problemnew/show/P4097 https://www.lydsy.com/JudgeOnline/problem.php?id=3165 ...

  7. 【题解】Luogu P4097 [HEOI2013]Segment

    原题传送门 这珂以说是李超线段树的模板题 按着题意写就行了,时间复杂度为\(O(n\log^2n)\) #include <bits/stdc++.h> #define N 40005 # ...

  8. Luogu P4097 [HEOI2013]Segment 李超线段树

    题目链接 \(Click\) \(Here\) 李超线段树的模板.但是因为我实在太\(Naive\)了,想象不到实现方法. 看代码就能懂的东西,放在这里用于复习. #include <bits/ ...

  9. 题解——洛谷P4095 [HEOI2013]Eden 的新背包问题(背包)

    思路很妙的背包 用了一些前缀和的思想 去掉了一个物品,我们可以从前i-1个和后i+1个推出答案 奇妙的思路 #include <cstdio> #include <algorithm ...

随机推荐

  1. C# 从零开始写 SharpDx 应用 绘制基础图形

    本文告诉大家通过 SharpDx 画出简单的 2D 界面 本文属于 SharpDx 系列 博客,建议从头开始读 本文分为两步,第一步是初始化,第二步才是画界面 初始化 先创建 RenderForm 用 ...

  2. ZR7.26

    7.26 A 并查集维护,时间复杂度我写的貌似不大对,先鸽一鸽 B 敦爷:\(w\)是这个区间的最大值当且仅当他是这个区间内最大的 我们发现结合昨天课件内的并查集 发现我们每次不断合并的本质是把所有\ ...

  3. Sending Packets LightOJ - 1321 (期望计算)

    题面: Alice and Bob are trying to communicate through the internet. Just assume that there are N route ...

  4. Linux网络IO模型

    同步和异步,阻塞和非阻塞 同步和异步 关注的是结果消息的通信机制 同步:同步的意思就是调用方需要主动等待结果的返回 异步:异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如,状态通知,回调函 ...

  5. Jmeter配置元件——JDBC Connection Configuration参数化

    在昨天Jmeter配置元件——CSV DataSet Config参数化一文中,有提到,在参数化时,还可以使用JDBC Connection Configuration配置元件实现,具体如何实现,如何 ...

  6. 38.CSS

    转载:https://www.cnblogs.com/yuanchenqi/articles/5977825.html css概述 CSS是Cascading Style Sheets的简称,中文称为 ...

  7. The sixth day of Crawler learning

    爬取我爱竞赛网的大量数据 首先获取每一种比赛信息的分类链接 def get_type_url(url):    web_data = requests.get(web_url)    soup = B ...

  8. 如何利用腾讯云COS为静态博客添加动态相册

    前言 本文首发于个人网站Jianger's Blog,欢迎访问订阅.个人博客小站刚建站不久,想着除了主题里的功能外再添加上相册模块,于是半搜索半摸索把相册模块搞出来了,最后采用了利用腾讯云对象存储作图 ...

  9. 利用Feed43为网站自制RSS源

    什么是RSS,它可以做什么 快2020年了,RSS日渐式微,我也是去年机缘巧合下才开始使用的,以前只是听说过.RSS,全称Really Simple Syndication,又称简易信息聚合(也叫聚合 ...

  10. beta 1/2 阶段中间产物提交入口

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9918 git地址:https://e.coding.net/Eustia ...