首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Ice-cream Tycoon:線段樹單點更新與區間查詢購買

     編輯:C++ 入門

操作定義

  • ARRIVE a b:進貨 a 個單價 b 的冰淇淋
  • BUY a b:用 b 元買 a 個最便宜的,能買輸出 HAPPY 並扣除庫存,否則 UNHAPPY

離散化 + 線段樹

先讀入所有操作,收集進貨價格離散化建樹。每個節點維護:

  • num:區間冰淇淋總數
  • sum:區間總價值
  • price:葉節點單價

關鍵操作

// 單點更新進貨
void update(int v, int pos, LL num, LL mon, LL t) {
    if (tree[v].l == tree[v].r) {
        if (!tree[v].price) tree[v].price = mon;
        tree[v].num += num; tree[v].sum += t; return;
    }
    push_down(v);
    int mid = (tree[v].l + tree[v].r) >> 1;
    if (pos <= mid) update(v*2, pos, num, mon, t);
    else update(v*2+1, pos, num, mon, t);
    push_up(v);
}

// 購買查詢:優先左子樹(便宜),返回總價或 -1
LL query(int v, LL num) {
    if (tree[v].num < num) return -1;
    if (tree[v].num == num) return tree[v].sum;
    if (tree[v].l == tree[v].r) return tree[v].price * num;
    if (tree[v*2].num >= num) return query(v*2, num);
    return tree[v*2].sum + query(v*2+1, num - tree[v*2].num);
}

// 購買後扣除庫存
void update_1(int v, LL num, LL sum) { ... }

主循環按輸入順序處理操作,BUY 先 query 再 update_1。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved