传送门

简单来说就是对于每条线段,先把它拆成\(O(logn)\)条,然后对于每一条再\(O(logn)\)判断在所有子区间的优劣程度

//minamoto
#include<bits/stdc++.h>
#define R register int
#define ls (p<<1)
#define rs (p<<1|1)
#define fp(i,a,b) for(R i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R i=a,I=b-1;i>I;--i)
#define go(u) for(R i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
inline int max(const R&x,const R&y){return x>y?x:y;}
inline int min(const R&x,const R&y){return x<y?x:y;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R res,f=1;char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=1e5+5;
struct node{
int l,r,id;
double yl,yr;
node(int x1=0,int y1=0,int x2=0,int y2=0,int i=0){
l=x1,r=x2;yl=y1,yr=y2;id=i;
if (l==r) yl=yr=max(yl,yr);
}
double get(int x){return l==r?yl:yl+(k()*(x-l));}
double k(){return (yr-yl)/(r-l);}
void lm(int x){yl=get(x);l=x;}
void rm(int x){yr=get(x);r=x;}
};
bool cmp(node a,node b,int x){
return a.get(x)==b.get(x)?a.id<b.id:a.get(x)>b.get(x);
}
struct TR{
node tr[N<<2];
void build(int p,int l,int r){
tr[p].l=l,tr[p].r=r;if(l==r)return;
R mid=(l+r)>>1;
build(ls,l,mid),build(rs,mid+1,r);
}
node query(int p,int l,int r,int x){
if(l==r)return tr[p];node res;R mid=(l+r)>>1;
res=(x<=mid)?query(ls,l,mid,x):query(rs,mid+1,r,x);
return cmp(res,tr[p],x)?res:tr[p];
}
void update(int p,int l,int r,node x){
if(tr[p].l>x.l)x.lm(tr[p].l);
if(tr[p].r<x.r)x.rm(tr[p].r);
R mid=(l+r)>>1;
if(cmp(x,tr[p],mid))swap(tr[p],x);
if(l==r||min(tr[p].yl,tr[p].yr)>=max(x.yl,x.yr))return;
tr[p].k()<=x.k()?update(rs,mid+1,r,x):update(ls,l,mid,x);
}
void insert(int p,int l,int r,node x){
if(x.l>r||x.r<l)return;
if(tr[p].l>x.l)x.lm(tr[p].l);if(tr[p].r<x.r)x.rm(tr[p].r);
if(l==x.l&&r==x.r)return (void)(update(p,l,r,x));
if(l==r)return;R mid=(l+r)>>1;
insert(ls,l,mid,x),insert(rs,mid+1,r,x);
}
}T;
int lastans,cnt,n=39989,lim=1e9,m,op,k,x,y,xx,yy;node res;
int main(){
// freopen("testdata.in","r",stdin);
T.build(1,1,n);m=read();
while(m--){
op=read();
if(!op){
k=read(),k=(k+lastans-1)%n+1;
lastans=T.query(1,1,n,k).id;
print(lastans);
}else{
x=read(),y=read(),xx=read(),yy=read();
x=(x+lastans-1)%n+1,xx=(xx+lastans-1)%n+1;
y=(y+lastans-1)%lim+1,yy=(yy+lastans-1)%lim+1;
if(x>xx)swap(x,xx),swap(y,yy);
res=node(x,y,xx,yy,++cnt),T.insert(1,1,n,res);
}
}return Ot(),0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. [洛谷P4097] [HEOI2013] Segment

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

  9. bzoj 3165: [Heoi2013]Segment 动态凸壳

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 202  Solved: 89[Submit][Stat ...

随机推荐

  1. Pull方式解析XML文件

    package com.pingyijinren.test; import android.content.Intent; import android.os.Handler; import andr ...

  2. sql语句在Mysql中如何执行?

    1.MySQL 主要分为 Server 层和引擎层,Server 层主要包括连接器.查询缓存.分析器.优化器.执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用,redo ...

  3. Jafka源码分析——LogManager

    在Kafka中,LogManager负责管理broker上全部的Log(每个topic-partition为一个Log). 通过阅读源码可知其详细完毕的功能例如以下: 1. 依照预设规则对消息队列进行 ...

  4. 【Android归纳】回调机制在Android中的应用与实战

    回调这样的思想在程序中是比較普遍的.有时候可能我们并没有注意到.近期整理了一些对于回调的理解,分享给大家 先上概念...... 什么是回调函数? 回调函数就是一个通过函数指针调用的函数. 假设你把函数 ...

  5. SDUT--找朋友(BFS&amp;&amp;DFS)

    找朋友 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 X,作为户外运动的忠实爱好者,总是不想呆在家里.如今,他想把死宅Y从家 ...

  6. Sping框架的IOC特性 悲观锁、乐观锁 Spring的AOP特性

    Sping框架的IOC特性 IOC(Inversion of Control):控制反转 以下以课程与老师的安排来介绍控制反转. 一个合理的课程编排系统应该围绕培训的内容为核心,而不应该以具体的培训老 ...

  7. maven 打包排除配置文件

    如果你想通过pom.xml文件的配置实现的话,你可以这样1.打jar包时过滤配置文件<build><!-- 过滤配置文件 --><resources><res ...

  8. delphi2010发送邮件—中文显示为乱码解决

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVsbG9fbXlob21l/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  9. spring mvc +Mybatis3.1 整合的时候异常

    在使用Mybatis3.10+spring3.10+mybatis-spring-1.0.0集成,使用spring 时发生例如以下错误: 严重: Servlet.service() for servl ...

  10. MySQL中文參考手冊

    非常好的中文手冊: 链接:http://www.sdau.edu.cn/support/mysq_doc/manual_toc.html