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

    思路:
    李超线段树
    我是把线段转成斜率的形式搞得 不知道有没有更简单的方法

    //By SiriusRen
    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int mod1=39989,mod2=1000000000;
    #define double long double
    int read(){
        int x=0;char p=getchar();
        while(p<'0'||p>'9')p=getchar();
        while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();
        return x;
    }
    int n,K,op,cnt,ans;
    double k,b,tempans;
    void eli(double x1,double y1,double x2,double y2){
        if(x1==x2)k=0;
        else k=(y2-y1)/(x2-x1);
        b=y1-k*x1;
    }
    struct Tree{double k,b;int id;}tr[555555];
    void insert(int l,int r,int pos,double k,double b,int id,int L,int R){
        int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
        if(l>=L&&r<=R){
            if(!tr[pos].id){tr[pos].k=k,tr[pos].b=b,tr[pos].id=id;return;}
            double val1=tr[pos].b+mid*tr[pos].k;
            double val2=b+mid*k;
            if(abs(tr[pos].k-k)<1e-15){if(tr[pos].b<b)tr[pos].b=b,tr[pos].id=id;}
            else if(l==r){
                if(val2>val1)tr[pos].k=k,tr[pos].b=b,tr[pos].id=id;
                else if(abs(val2-val1)<1e-15)tr[pos].id=min(tr[pos].id,id);
            }
            else if(tr[pos].k>k){
                if(val1>=val2)insert(l,mid,lson,k,b,id,L,R);
                else insert(mid+1,r,rson,tr[pos].k,tr[pos].b,tr[pos].id,L,R),tr[pos].k=k,tr[pos].b=b,tr[pos].id=id;
            }
            else{
                if(val1>=val2)insert(mid+1,r,rson,k,b,id,L,R);
                else insert(l,mid,lson,tr[pos].k,tr[pos].b,tr[pos].id,L,R),tr[pos].k=k,tr[pos].b=b,tr[pos].id=id;
            }return;
        }
        if(mid<L)insert(mid+1,r,rson,k,b,id,L,R);
        else if(mid>=R)insert(l,mid,lson,k,b,id,L,R);
        else insert(l,mid,lson,k,b,id,L,R),insert(mid+1,r,rson,k,b,id,L,R);
    }
    void query(int l,int r,int pos,int num){
        int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
        if(tr[pos].id){
            if(tempans<tr[pos].b+num*tr[pos].k)
                tempans=tr[pos].b+num*tr[pos].k,ans=tr[pos].id;
            else if(tempans==tr[pos].b+num*tr[pos].k)ans=min(tr[pos].id,ans);
        }
        if(l==r)return;
        if(mid<num)query(mid+1,r,rson,num);
        else query(l,mid,lson,num);
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            op=read();
            if(op){
                int x0=read(),y0=read(),x1=read(),y1=read();
                int ax=(x0+ans-1)%mod1+1,ay=(y0+ans-1)%mod2+1;
                int bx=(x1+ans-1)%mod1+1,by=(y1+ans-1)%mod2+1;
                eli(1.0*ax,1.0*ay,1.0*bx,1.0*by);
                insert(1,mod1,1,k,b,++cnt,min(ax,bx),max(ax,bx));
            }
            else{
                K=read(),K=(K+ans-1)%39989+1;
                ans=0,tempans=0,query(1,mod1,1,K),printf("%d
    ",ans);
            }
        }
    }

    这里写图片描述

  • 相关阅读:
    Java FileInputStream与FileReader的区别
    java 保存和读取本地json文件
    java写文件时往末尾追加文件(而不是覆盖原文件),的两种方法总结
    Java魔法堂:注解用法详解——@SuppressWarnings
    使用Restlet Client发送各种Get和Post请求
    postman VS restlet client基本使用
    Java获取请求客户端的真实IP地址
    dom4j解析xml字符串实例
    C++ Boost库简介(一些自己的感受)
    打仗其实最讲成本核算,大炮轰的都是黄金,日军在中国就是不断赔本
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532074.html
Copyright © 2011-2022 走看看