传送门

简单来说就是对于每条线段,先把它拆成\(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. 2019.4.1今日一练String类中的方法

    package com.pjc.objects;                        replaceAll()方法的理解引出正则表达式import java.util.regex.Patte ...

  2. 对于事务ACID的理解

    ACID,即以下四点: 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 一致性(Consistency) 事务前后数据的完整性必须保持一致 ...

  3. JavaScript错误处理和堆栈追踪

    转自:https://github.com/dwqs/blog/issues/49 有时我们会忽略错误处理和堆栈追踪的一些细节, 但是这些细节对于写与测试或错误处理相关的库来说是非常有用的. 例如这周 ...

  4. 010 ACL

    Router>en Router#config t Enter configuration commands, one per line.  End with CNTL/Z. Router(co ...

  5. 自已实现一个UI库

    [2014年写一个UI库时写的几个文章,公布出来] 几年前的一个嵌入式的UI开发,使自己有机会接触到了UI的一些底层知识,尽管之前也开发过非常多Windows下的信息应用系统,也做非常多的界面开发,但 ...

  6. div拖拽缩放jquery插件编写——带8个控制点

    项目中需要对div进行拖拽缩放,需要有控制面板8个控制点的那种,原以为这么常见的效果应该能搜索到很多相关插件,然而可以完成拖拽的实繁,却找不到我想要的,还是自己动手丰衣足食吧 效果预览(只支持pc端) ...

  7. [Canvas画图] 藏图阁(16) 人体穴位

    本节目标: 趁着今天是愚人节.阿伟决定来重温一下学医的那段日子. 有那么一段时间, 阿伟对武侠小说和医学同一时候产生了浓厚的兴趣,当时最想学的就是葵花点穴手, 一阳指之类的点穴功夫.轻轻一点.就能把别 ...

  8. Canny算法源码,欢迎交流

    http://blog.csdn.net/jianxiong8814/article/details/1563109 http://blog.csdn.net/assuper/article/deta ...

  9. 浅析java(多方面解读)

    昨天我简单的说了一下我的编程学习之路.假设你热爱编程.而不是仅为了赚钱,我想我的经历或许会给你带来一定的启示,假设你还没有看.请先慢慢读完我的编程学习之路,您肯定会有还有一番体会的.. 好了.废话不多 ...

  10. Visual Studio静态编译

    1.Visual Studio静态编译设置: [Project]-[prj_name Properties],按例如以下框设置 2.why配置成静态编译? 假设动态编译,在没有安装Visual Stu ...