原题传送门

这珂以说是李超线段树的模板题

按着题意写就行了,时间复杂度为\(O(n\log^2n)\)

#include <bits/stdc++.h>
#define N 40005
#define db double
#define getchar nc
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
inline db Max(register db a,register db b)
{
return a>b?a:b;
}
struct node{
db k,b;
int id;
node(register int ax=0,register int ay=0,register int bx=0,register int by=0,register int ID=0)
{
id=ID;
if(ax==bx)
k=0,b=Max(ay,by);
else
k=(db)(ay-by)/(ax-bx),b=(db)ay-k*ax;
}
inline db getv(register int x)
{
return k*x+b;
}
};
inline bool cmp(register node a,register node b,register int x)
{
if(!a.id)
return 1;
return a.getv(x)!=b.getv(x)?a.getv(x)<b.getv(x):a.id<b.id;
}
node tr[N<<2];
inline void insert(register int x,register int l,register int r,register node v)
{
if(!tr[x].id)
tr[x]=v;
if(cmp(tr[x],v,l))
swap(tr[x],v);
if(l==r||tr[x].k==v.k)
return;
int mid=l+r>>1;
db X=(tr[x].b-v.b)/(v.k-tr[x].k);
if(X<l||X>r)
return;
if(X<=mid)
insert(x<<1,l,mid,tr[x]),tr[x]=v;
else
insert(x<<1|1,mid+1,r,v);
}
inline void Insert(register int x,register int l,register int r,register int L,register int R,register node v)
{
if(L<=l&&r<=R)
{
insert(x,l,r,v);
return;
}
int mid=l+r>>1;
if(L<=mid)
Insert(x<<1,l,mid,L,R,v);
if(R>mid)
Insert(x<<1|1,mid+1,r,L,R,v);
}
inline node query(register int x,register int l,register int r,register int pos)
{
if(l==r)
return tr[x];
int mid=l+r>>1;
node tmp;
if(pos<=mid)
tmp=query(x<<1,l,mid,pos);
else
tmp=query(x<<1|1,mid+1,r,pos);
return cmp(tr[x],tmp,pos)?tmp:tr[x];
}
int n,m,lans=0,cnt=0;
#define p1 39989
#define p2 1000000000
int main()
{
m=read(),n=40000;
while(m--)
{
int opt=read();
if(opt==0)
{
int x=read();
x=(x+lans-1)%p1+1;
lans=query(1,1,n,x).id;
write(lans),puts("");
}
else
{
int ax=read(),ay=read(),bx=read(),by=read();
ax=(ax+lans-1)%p1+1,bx=(bx+lans-1)%p1+1;
ay=(ay+lans-1)%p2+1,by=(by+lans-1)%p2+1;
if(ax>bx)
{
ax^=bx^=ax^=bx;
ay^=by^=ay^=by;
}
Insert(1,1,n,ax,bx,node(ax,ay,bx,by,++cnt));
}
}
return 0;
}

【题解】Luogu P4097 [HEOI2013]Segment的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. [洛谷P4097] [HEOI2013] Segment

    Description 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第 \(i\) 条被插入的线段的标号为 \(i\) 2.给定一个数 \(k\) ,询问与直线 \(x = k\ ...

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

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

  8. P4097 [HEOI2013]Segment

    传送门 简单来说就是对于每条线段,先把它拆成\(O(logn)\)条,然后对于每一条再\(O(logn)\)判断在所有子区间的优劣程度 //minamoto #include<bits/stdc ...

  9. Bzoj 3165 [Heoi2013]Segment题解

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

随机推荐

  1. 电子产品使用感受之——为什么我那么喜欢2015年的11.6寸MacBook Air?

    2018年Mac笔记本产品线得到了一次更新,Mac book Pro, MacBook Air更新后的Mac 产品线变得更加让人摸不着头脑,价格昂贵不说,产品分类细化到如此程度,让一个选择困难症的消费 ...

  2. css_文本溢出

    1.单行文本溢出隐藏,显示省略号 2.多行文本溢出隐藏,显示省略号 1.只针对用webkit内核浏览器渲染页面才会有效果 2.(多行文本溢出隐藏,显示省略号)通用方法

  3. 【Python基础】lpthw - Exercise 38 列表的操作

    1.列表和字符串操作的混合练习 ten_things = "apples oranges crows telephone light sugar" print("Wait ...

  4. Centos-7.4_安装_Redis_4.0.8

    一.安装redis 第一步:下载redis安装包 [root@Redis ~]# mkdir /usr/local/redis/ --创建目录 [root@Redis redis]# cd /usr/ ...

  5. js考察this,作用域链和闭包

    在严格版中的默认的this不再是window,而是undefined. 先看两个例子 example one var num = 20; var obj = { num: 30, fn: (funct ...

  6. esp32驱动SSD1306的oled显示汉字(micropython)

    1.完整源码: 主函数oled.py from ssd1306 import SSD1306_SPI from ssd1306 import SSD1306 import font import ma ...

  7. Python001-操作MSSQL(Microsoft sql server)基础示例(一)

    Python操作mssql server数据库可以通过pymssql或pyodbc实现的.此文以pymssql为例.Python操作MSSQL基本操作步骤如下所示: 获取数据库连接Connection ...

  8. vue项目打包之后js文件过大怎么办?

  9. oracle单字段拆分成多行

    已上图为例 先以逗号分隔拆分 拆分函数: CREATE OR REPLACE FUNCTION SPLIT(P_STRING VARCHAR2, P_SEP VARCHAR2 := ',') RETU ...

  10. 2019春第八周作业Compile Summarize

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 在这里 我在这个课程的目标是 能更加进一步的够熟练掌握指针的用法 这个作业在那个具体方面帮助我实现目标 指针对于高阶题目的做法 参考文献与 ...