题目大意:维护一个二维平面,给定若干条线段,支持询问任意整数横坐标处对应的纵坐标最靠上的线段的 id,相同高度取 id 值较小的,强制在线。

题解:初步学习了李超线段树。李超线段树的核心思想在于通过标记永久化的方式来维护斜率。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const double eps=1e-6; inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
} int n,lastans,cnt;
struct line{double k,b;int id;};
struct node{
#define ls(x) t[x].lc
#define rs(x) t[x].rc
int lc,rc;bool tag;line s;
}t[maxn];
int tot,root;
void pushdown(int o,int l,int r,line now){
if(!t[o].tag){t[o].s=now,t[o].tag=1;return;}
double l1=now.k*l+now.b,r1=now.k*r+now.b;
double l2=t[o].s.k*l+t[o].s.b,r2=t[o].s.k*r+t[o].s.b;
if(l2>=l1&&r2>=r1)return;
else if(l1>=l2&&r1>=r2){t[o].s=now;return;}
else{
double pos=(now.b-t[o].s.b)/(t[o].s.k-now.k);
int mid=l+r>>1;
if(pos<=mid)pushdown(ls(o),l,mid,r1>r2?t[o].s:now);
else pushdown(rs(o),mid+1,r,r1>r2?now:t[o].s);
if((l1>l2&&pos>mid)||(pos<=mid&&r1>r2))t[o].s=now;
}
}
int build(int l,int r){
int x=++tot;
if(l==r)return x;
int mid=l+r>>1;
ls(x)=build(l,mid),rs(x)=build(mid+1,r);
return x;
}
void modify(int o,int l,int r,int x,int y,line now){
if(l==x&&r==y){pushdown(o,l,r,now);return;}
int mid=l+r>>1;
if(y<=mid)modify(ls(o),l,mid,x,y,now);
else if(x>mid)modify(rs(o),mid+1,r,x,y,now);
else modify(ls(o),l,mid,x,mid,now),modify(rs(o),mid+1,r,mid+1,y,now);
}
line query(int o,int l,int r,int pos){
if(l==r)return t[o].tag?t[o].s:line{0,0,0};
int mid=l+r>>1;
line res=pos<=mid?query(ls(o),l,mid,pos):query(rs(o),mid+1,r,pos);
if(!t[o].tag)return res;
double v1=t[o].s.k*pos+t[o].s.b,v2=res.k*pos+res.b;
if(!res.id||v1>v2||(fabs(v1-v2)<eps&&t[o].s.id<res.id))res=t[o].s;
return res;
} void solve(){
n=read();
root=build(1,39989);
while(n--){
int opt=read();
if(opt==0){
int pos=(read()+lastans-1)%39989+1;
printf("%d\n",lastans=query(root,1,39989,pos).id);
}else{
int x0=read(),y0=read(),x1=read(),y1=read();
x0 = (x0 + lastans - 1) % 39989 + 1;
x1 = (x1 + lastans - 1) % 39989 + 1;
y0 = (y0 + lastans - 1) % (int) (1e9) + 1;
y1 = (y1 + lastans - 1) % (int) (1e9) + 1;
if(x0==x1)modify(root,1,39989,x0,x1,line{0.0,max(y0,y1),++cnt});
else{
if(x0>x1)swap(x0,x1),swap(y0,y1);
double k=(double)(y0-y1)/(x0-x1),b=(double)y0-k*x0;
modify(root,1,39989,x0,x1,line{k,b,++cnt});
}
}
}
} int main(){
solve();
return 0;
}

【洛谷P4097】Segment 李超线段树的更多相关文章

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

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

  2. 【BZOJ-3165】Segment 李超线段树(标记永久化)

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 368  Solved: 148[Submit][Sta ...

  3. Segment 李超线段树

    题目大意: 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 2.给定一个数 k,询问与直线 x = k 相交的线段中,交点最靠上的线段的编号. 若 ...

  4. BZOJ3165: [Heoi2013]Segment(李超线段树)

    题意 题目链接 Sol 李超线段树板子题.具体原理就不讲了. 一开始自己yy着写差点写自闭都快把叉积搬出来了... 后来看了下litble的写法才发现原来可以写的这么清晰简洁Orz #include& ...

  5. 【BZOJ 3165】 [Heoi2013]Segment 李超线段树

    所谓李超线段树就是解决此题一类的问题(线段覆盖查询点最大(小)),把原本计算几何的题目变成了简单的线段树,巧妙地结合了线段树的标记永久化与标记下传,在不考虑精度误差的影响下,打法应该是这样的. #in ...

  6. P4097 [HEOI2013]Segment 李超线段树

    $ \color{#0066ff}{ 题目描述 }$ 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 给定一个数 k,询问与直线 x = k 相交的线 ...

  7. 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  8. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  9. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...

随机推荐

  1. 分布式监控系统Zabbix-3.0.3-完整安装记录(3)-监控nginx,php,memcache,Low-level discovery磁盘IO

    前段时间在公司IDC服务器上部署了zabbix3.0.3监控系统,除了自带的内存/带宽/CPU负载等系统资源监控模板以及mysql监控模板外,接下来对诸如nginx.php.memcache.磁盘IO ...

  2. 牛客多校第三场-A-PACM Team-多维背包的01变种

    题目我就不贴了...说不定被查到要GG... 题意就是我们需要在P,A,C,M四个属性的限制下,找到符合条件的最优解... 这样我们就需要按照0/1背包的思路,建立一个五维度数组dp[i][j][k] ...

  3. 关于dreamweaver的软件测评

    最近在用javascript编写程序,于是便用到了dreamweaver .所以,想写一个关于dreamweaver的软件测评. 学生本人使用的是dreamweaver 8.首先,谈谈本人使用感受,打 ...

  4. Java多线程的使用以及原理

    Java有两种方式实现多线程. 第一种——继承Thread类,并重写run方法 步骤: 定义类继承Thread类: 重写子类的run方法,将线程需要执行的代码写在run方法中: 创建子类的对象,则创建 ...

  5. [BUAA-SE-2018]结对作业测试报告

    目录 1. 测试方式 2. 评分规则 2.1 测试点组成 2.2 性能测试的分级 2.3 重新提交的扣分策略 3. 评测结果 3.1 罗老师班 3.2 任老师班 3.3 表中数据的说明 4. 测试点下 ...

  6. QQ通信机制(转)

    下面有4个基本的问答: 问题一:为什么只要可以连上互联网的计算机都可以用QQ相互建立通信,而不需要固定IP?也就是这个QQ用户端是怎样找到另一个QQ用户的,而用户在每次使用时他可能用的是不同的计算机, ...

  7. is interest important?

    学习是不是一定要看兴趣呢?高中时觉得只要肯学即使不喜欢又能如何,大学之后被深深打脸,面对一周那么多的实习和报告,我悄悄告诉自己不是这块料 有一些事情我就是学不会.我却很容易相信一个人. 因此,无论我如 ...

  8. Beta 总结

    前言 作业发布 组长 成员 贡献分 ★ 530 雨勤 14 311 旭 15 403 俊 16 223 元 14 437 海辉 17 7天 Beta 冲刺站立会议博客链接汇总 Beta 冲刺 (1/7 ...

  9. Knowledge-Defined Networking

    知识定义的网络(Knowledge-Defined Networking) 来源:ACM SIGCOMM Computer Communication Review 年份:2017 是什么:容纳和利用 ...

  10. 【转帖】intel 2018年1 月2号爆出漏洞分析 知乎匿名用户

    作者:匿名用户链接:https://www.zhihu.com/question/265012502/answer/288407097来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...