zoukankan      html  css  js  c++  java
  • 【洛谷 P4254】 [JSOI2008]Blue Mary开公司(李超线段树)

    题目链接
    其实这东西很好懂的。。用来维护一次函数。
    每个结点存一个值,表示x=这个区间的mid时值最大的函数的编号。
    把插入线段的斜率和当前结点的斜率和大小比较来更新左右儿子的值。
    查询是实际上是查询从根到这个叶节点链上的最大值。。

    #include <cstdio>
    #include <iostream>
    using namespace std;
    const int MAXN = 200010;
    #define lc (now << 1)
    #define rc (now << 1 | 1)
    #define Query(x) ans = -1e18; query(1, 1, 50000, x);
    struct seg{
        double k, b;
    }p[MAXN];
    inline double calc(int id, int day){
        return p[id].k * (day - 1) + p[id].b;
    }
    inline int judge(int id, int old, int day){
        return calc(id, day) > calc(old, day);
    }
    int n, t[MAXN << 2], cnt;
    char s[10];
    double ans, a, b;
    void insert(int now, int l, int r, int c){
        int mid = (l + r) >> 1;
        if(l == r){
            if(judge(c, t[now], mid)) t[now] = c;
            return;
        }
        if(p[t[now]].k < p[c].k){
            if(judge(c, t[now], mid))
              insert(lc, l, mid, t[now]), t[now] = c;
            else insert(rc, mid + 1, r, c);
        }else{
            if(judge(c, t[now], mid))
              insert(rc, mid + 1, r, t[now]), t[now] = c;
            else insert(lc, l, mid, c);
        }
    }
    void query(int now, int l, int r, int day){
        ans = max(ans, calc(t[now], day));
        if(l == r) return;
        int mid = (l + r) >> 1;
        if(day <= mid) query(lc, l, mid, day);
        else query(rc, mid + 1, r, day);
    }
    int main(){
        scanf("%d", &n);
        for(int i = 1; i <= n; ++i){
           scanf("%s", s);
           if(s[0] == 'Q'){
               scanf("%lf", &a);
               Query(a); printf("%d
    ", ((int)ans) / 100);
           }
           else if(s[0] == 'P'){
               scanf("%lf%lf", &a, &b);
               p[++cnt] = (seg){ b, a };
               insert(1, 1, 50000, cnt);
           }
        }
        return 0;
    }
    
  • 相关阅读:
    图解HTTP学习笔记——简单的HTTP协议
    Java编程思想学习笔记——类型信息
    Java编程思想学习笔记——字符串
    Java编程思想学习笔记——接口
    Java编程思想学习笔记——复用类
    Java编程思想学习笔记——类的访问权限
    ESLint
    关于常见继承的几种方法
    flux,redux,vuex状态集管理工具之间的区别
    商品放大镜效果
  • 原文地址:https://www.cnblogs.com/Qihoo360/p/10920129.html
Copyright © 2011-2022 走看看