博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P4097 [HEOI2013]Segment
阅读量:6510 次
发布时间:2019-06-24

本文共 2515 字,大约阅读时间需要 8 分钟。

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

//minamoto#include
#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 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
'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.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
>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
x.l)x.lm(tr[p].l);if(tr[p].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;}

转载于:https://www.cnblogs.com/bztMinamoto/p/10063972.html

你可能感兴趣的文章
php des 加密解密实例
查看>>
【Mac】Mac键盘实现Home, End, Page UP, Page DOWN
查看>>
实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求
查看>>
安德鲁斯----多媒体编程
查看>>
[zz]在linux中出现there are stopped jobs 的解决方法
查看>>
Delphi下实现全屏快速找图找色 一、数据提取
查看>>
查询表字段信息
查看>>
关于机器学习的最佳科普文章:《从机器学习谈起》
查看>>
dxFlowChart运行时调出编辑器
查看>>
NET Framework 3.0 (WinFX) RTM发布
查看>>
图片拼接器
查看>>
C++ TinyXml操作(含源码下载)
查看>>
中断小笔记
查看>>
C#委托、事件、消息(入门级)
查看>>
FreeBinary 格式说明
查看>>
使用Spring Cloud和Docker构建微服务
查看>>
NB-IoT的成功商用不是一蹴而就
查看>>
九州云实战人员为您揭秘成功部署OpenStack几大要点
查看>>
1.电子商务支付方式有哪些 2.比较不同支付方式的优势劣势
查看>>
医疗卫生系统被爆漏洞,7亿公民信息泄露……
查看>>