hdu5861 維護最大最小值線段樹

2021-07-16 22:23:24 字數 2122 閱讀 1336

題意:有n 個村莊在一條公路上,每兩個村莊之間的路有使用和不使用兩種狀態,使用時,每天需耗費wi 元,每段路初始時都是不使用的,在m 天中,我們總共可以開啟一次、關閉一次,從第一天到第m 天,每一天給出ai、bi,表示ai 到bi 之間的路必須是通的,問每一天n-1段路的總耗費最小為多少。

思路:每段路只能開啟一次,關閉一次,我們可以求出第i 段路最早什麼時候使用t1,最晚什麼時候使用t2,那麼我們就可以在天數t1 開啟它,t2+1關閉它。

離線+線段樹可以處理出每一段路的引數t1、t2。比如第i 天要使用ai 到bi,那麼ai 到bi 賦值i ,維護最大值和最小值即可。

接下來可以用vector v[n];來儲存第i 天要開啟哪些路,再用乙個儲存第i 天關閉哪些路。開啟路i 就是點i 賦值wi,關閉就是賦值0。

遍歷m 天,對於每一天,進行完開啟和關閉操作後,輸出總和就好。

查詢第i條路的最大最小值

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define lson rt<<1

#define rson rt<<1|1

#define n 200020

#define m 100010

#define mod 1000000007

#define ll long long

#define inf 0x7fffffff

#define for(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)

#define rep(i,f_end,f_start) for(int i=f_end;i>=f_start;i--)

#define mem(x,i) memset(x,i,sizeof(x))

struct node

};node v[n<<2];

void build(int l,int r,int rt)

void push_day(int rt)

if(v[rt].max!=0) }

void update_day(int l,int r,int g,int rt)

push_day(rt);

int mid=v[rt].mid();

if(l>=mid) update_day(l,r,g,rson);

else

if(r<=mid) update_day(l,r,g,lson);

else }

void look_day(int x,int &max,int &min,int rt)

push_day(rt);

int mid=v[rt].mid();

if(xelse

if(x>=mid) look_day(x,max,min,rson);

}vector

vv[n];

vector

u[n];

int w[n];

void up(int rt)

void update(int x,int w,int rt)

int mid=v[rt].mid();

if(xelse

if(x>=mid) update(x,w,rson);

up(rt);

}void update(int x,int rt)

int mid=v[rt].mid();

if(xelse

if(x>=mid) update(x,rson);

up(rt);

}int main()

for(i,1,m)

for(i,1,n-1)

for(i,1,m)

for(int j=0;j1);

}printf("%d\n",v[1].w);

}for(i,1,m+1)

} return

0;}

普通線段樹維護區間最大最小值(板子)

線段樹維護區間最大 小值就是按照原來給出的資料的順序建造一顆二叉樹,然後每乙個節點維護 這個節點的子節點且包含這個節點的值中的最大 小值 include include include include using namespace std define ll long long const int...

Function 線段樹維護區間最小值 思維

給定乙個長度為n的序列,根據上面的公式,求出f l,r 仔細觀察後發現,當l r時,答案是a l 當l r時,答案是a l a l 1 a r 假設乙個數x模乙個比它大的數,相當於沒有模,只有比x小的數才起到了取模的作用。那麼我們用線段樹維護區間最小值,每次查詢 l 1,r 範圍內第乙個比x小的數的...

HDU 1185 最大最小值 線段樹(結構體)

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 給出n個整數,執行m次詢問。對於每次詢問,首先輸入三個整數c l r 如果c等於1,輸出第l個數到第r個數之間的最小值 如果c等於2,輸出第l個數到第r個數之間的最大值 如果c等於3,輸出第l個數到第r個數之間的最小值與最大值的...