loj#6034 「雅礼集训 2017 Day2」线段游戏

分析

区间李超树板子题

代码

#include<bits/stdc++.h>
using namespace std;
#define db double
const int inf = 1e8;
const int N = 1e5;
int n,m,is;
struct node {
    int x1,x2;
    db y1,y2;
    node(int x1=-N,int x2=N,db y1=-1e8,db y2=-1e8):x1(x1),x2(x2),y1(y1),y2(y2) {}
};
node d[800100];
inline db calc(node x,int pl){
    if(x.x2==x.x1)return max(x.y1,x.y2);
    return x.y1+(db)(x.y2-x.y1)/(x.x2-x.x1)*(pl-x.x1);
}
inline void update(int le,int ri,int wh,node x){
    if(x.x1>ri||x.x2<le)return;
    int mid=(le+ri)>>1;
    if(x.x1<=le&&x.x2>=ri){
        db t1=calc(d[wh],mid),t2=calc(x,mid);
      if(t1<t2){
          if(calc(d[wh],le)>calc(x,le))update(le,mid,wh<<1,d[wh]);
          if(calc(d[wh],ri)>calc(x,ri))update(mid+1,ri,wh<<1|1,d[wh]);
          d[wh]=x;
      }else {
          if(calc(x,le)>calc(d[wh],le))update(le,mid,wh<<1,x);
          if(calc(x,ri)>calc(d[wh],ri))update(mid+1,ri,wh<<1|1,x);
      }
      return;
    }
    if(mid>=x.x1)update(le,mid,wh<<1,x);
    if(mid<x.x2)update(mid+1,ri,wh<<1|1,x);
    return;
}
inline db q(int le,int ri,int wh,int pl){
    if(le==ri)return calc(d[wh],pl);
    int mid=(le+ri)>>1;
    db ans=calc(d[wh],pl);
    if(mid>=pl)ans=max(ans,q(le,mid,wh<<1,pl));
      else ans=max(ans,q(mid+1,ri,wh<<1|1,pl));
    return ans;
}
int main(){
    int i,j,k;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++){
      int x1,x2,y1,y2;
      cin>>x1>>y1>>x2>>y2;
      if(x1>x2)swap(x1,x2),swap(y1,y2);
      update(1,N,1,node(x1,x2,y1,y2));
    }
    for(i=1;i<=m;i++){
      scanf("%d",&k);
      if(!k){
          int x1,x2,y1,y2;
        cin>>x1>>y1>>x2>>y2;
        if(x1>x2)swap(x1,x2),swap(y1,y2);
        update(1,N,1,node(x1,x2,y1,y2));
      }else {
          int x;scanf("%d",&x);
          db res=q(1,N,1,x);
          printf("%0.2lf\n",res<=-inf?0:res);
      }
    }
    return 0;
}

 

posted @ 2019-10-30 14:44  水题收割者  阅读(210)  评论(0编辑  收藏  举报