zoukankan      html  css  js  c++  java
  • 李超线段树

    李超线段树可以用来维护平面上的线段(但是要求 (x)(y) 其中一维比较小,在 (10^5) 及以内)。

    称一条线段能成为区间 ([l,r]) 中的最优线段,当且仅当:

    • 该线段的定义域完整覆盖了区间 ([l,r])

    • 该线段在区间中点处最优。

    模板题:P4097 [HEOI2013]Segment

    题意:给定平面上的一些线段,每次询问求出当前与 (x=k) 相交的线段中 (y) 值最大的线段编号。

    直接按照题目题意来建立线段树并查询即可。

    #define eps 1e-8
    #define Maxn 100005
    #define MAX 66005
    #define mod 39989
    #define pa pair<double,double>
    #define fi first
    #define se second
    typedef long long ll;
    int n,tot;
    int tree[Maxn<<2];
    pa Line[Maxn];
    inline double f(pa y,int x) { return y.fi*x+y.se; }
    inline int tomax(int a,int b,int x) { return (f(Line[a],x)>f(Line[b],x)+eps)?a:b; }
    void add(int p,int nl,int nr,int k,int l,int r)
    {
    	 int mid=(nl+nr)>>1;
    	 if(nl>=l && nr<=r)
    	 {
    	 	 if(f(Line[k],mid)>f(Line[tree[p]],mid)+eps) swap(tree[p],k);
    	 	 if(f(Line[k],nl)>f(Line[tree[p]],nl)+eps) add(p<<1,nl,mid,k,l,r);
    	 	 if(f(Line[k],nr)>f(Line[tree[p]],nr)+eps) add(p<<1|1,mid+1,nr,k,l,r);
    		 return;
    	 }
    	 if(mid>=l) add(p<<1,nl,mid,k,l,r);
    	 if(mid<r) add(p<<1|1,mid+1,nr,k,l,r);
    }
    
    int query(int p,int nl,int nr,int x)
    {
    	 if(nl==nr) return tree[p];
    	 int mid=(nl+nr)>>1;
    	 if(mid>=x) return tomax(tree[p],query(p<<1,nl,mid,x),x);
    	 else return tomax(tree[p],query(p<<1|1,mid+1,nr,x),x);
    	 return 0;
    }
    int main()
    {
    	 n=rd();
    	 for(int i=1,opt,a1,b1,a2,b2,k,Last=0;i<=n;i++)
    	 {
    	 	 opt=rd();
    	 	 if(opt==1)
    	 	 {
    	 	 	 a1=(rd()+Last-1)%mod+1,b1=(rd()+Last-1)%1000000000+1;
    	 	 	 a2=(rd()+Last-1)%mod+1,b2=(rd()+Last-1)%1000000000+1;
    	 	 	 if(a1==a2) Line[++tot]=pa(0.0,1.0*max(b1,b2));
    	 	 	 else Line[++tot]=pa(1.0*(b2-b1)/(a2-a1),1.0*b1-1.0*(b2-b1)/(a2-a1)*a1);
    	 	 	 add(1,1,MAX,tot,min(a1,a2),max(a1,a2));
    		 }
    		 else k=(rd()+Last-1)%mod+1,printf("%d
    ",Last=query(1,1,MAX,k));
    	 }
    	 return 0;
    }
    
  • 相关阅读:
    JMeter性能测试中控制业务比例
    软件版本命名规范
    软件测试方法——静态测试与动态测试
    安装BugFree 3.0.4时出现的问题
    Linux下给mysql创建用户分配权限
    LoadRunner 测试脚本
    linux dd命令详解
    Linux查看CPU和内存使用情况
    Error:java: 无效的源发行版: 10
    rf接口自动化之结果校验
  • 原文地址:https://www.cnblogs.com/EricQian/p/15466616.html
Copyright © 2011-2022 走看看