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;
    }
    
  • 相关阅读:
    关于Certificate、Provisioning Profile
    苹果开发者账号类型
    在 iTunes Connect 中,无法找到“My Apps”选项
    iOS 开发,相关网址
    dart 使用
    initState 必须调用 super.initState(); 否则报错
    TabBar 设置可滚动:isScrollable: true
    flutter 从创建到渲染的大体流程
    获取对象State的方法
    beforeRouteEnter 与 beforeRouteUpdate(watch $route 对象) 的区别
  • 原文地址:https://www.cnblogs.com/Qihoo360/p/10920129.html
Copyright © 2011-2022 走看看