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;
    }
    
  • 相关阅读:
    Java 8 不收费版本及下载
    java 文档注释 -- javadoc 标签
    Java中的基本数据类型int及数据溢出
    Excel处理数据的方法记录
    Vue显示favicon.icon的方法
    Xshell之复制粘贴快捷键
    FTP客户端软件介绍
    netstat命令详解
    Flutter之摇一摇功能的实现
    Flutter之扫描二维码功能的实现
  • 原文地址:https://www.cnblogs.com/Qihoo360/p/10920129.html
Copyright © 2011-2022 走看看