p1906【線段樹】火車線路
時間限制 : 10000 ms 空間限制 : 65536 kb
問題描述
某列火車行使在c個城市之間(出發的城市編號為1,結束達到的城市的編號為c),假設該列火車有s個座位,現在有r筆預訂票的業務。現在想對這r筆業務進行處理,看哪些預定能滿足,哪些不能滿足。
一筆預定由o、d、n三個整數組成,表示從起點站o到目標站d需要預定n個座位。一筆預定能滿足是指該筆業務在行程範圍內有能滿足的空座位,否則就不能滿足。一筆業務不能拆分,也就是起點和終點站不能更改,預定的座位數目也不能更改。所有的預定需求按給出先後順序進行處理。
請你編寫程式,看那些預定業務能滿足,那些不能滿足。
輸入格式
第一行為三個整數c、s、r,(1<=c<=60 000, 1<=s<=60 000, 1<=r<=60 000)他們之間用空隔分開。接下來的r行每行為三個整數o、d、n,(1<=o
區間修改的區間最小值。
由題意題意知,給定乙個區間每次修改乙個區間的值,若能輸出t,若不能則輸出n。稍加分析即可知,乙個區間能否被修改取決其min,所以建樹時n表示該區間最小的值,因為是區間操作用lazy標記加以維護。
因為到終點不能賴在車上,所以要左閉右開。
醜**
#include
#include
#include
#include
#include
using
namespace
std;
#define maxn 480000
#define inf 999999999
struct node;
node tree[maxn];
int c,s,r;
void bt(int p,int x,int y)
}void pd(int k)
int query(int k,int x,int y)
void change(int k,int x,int y,int z)
int mid=(tree[k].l+tree[k].r)>>1;
if(mid>=x) change(k<<1,x,y,z);
if(mid1|1,x,y,z);
tree[k].n=min(tree[k<<1].n,tree[k<<1|1].n);
}int main()
else
cout
<<"n"
<}
}
線段樹 P4588 線段樹用法
簡單來說就是使用線段樹來儲存操作步驟,因為如果直接計算的話long long會溢位,所以建立乙個 1,q 的線段樹,使用線段樹的葉子節點來表示權值,非葉子節點表示操作過程 開始的時候線段樹的葉子節點初始化為1,而非葉子節點c k c k 1 c k 1 1 mod 也為1。當開始進行操作的時候,如果...
線段樹2 洛谷p3373 線段樹
題目位址 解釋 多了乙個乘法操作,可以考慮優先順序。每次先算乘法。首先,對於乙個區間 和為s 假設已經按 a 乘b進行了操作。值得到的值為 s a b sb ab 假設先乘得到 sb a 這樣相比,add應該還要再乘上乙個b才對,所以,當更新到乙個區間時,為了進行先乘的操作而不讓結果發生變化,應該將...
P3373 線段樹模板
如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包...