題目描述
水果姐今天心情不錯,來到了水果街。
水果街有
n家水果店,呈直線結構,編號為
1~n,每家店能買水果也能賣水果,並且同一家店賣與買的**一樣。
學過oi
的水果姐迅速發現了乙個賺錢的方法:在某家水果店買乙個水果,再到另外一家店賣出去,賺差價。
就在水果姐竊喜的時候,
cgh突然出現,他為了為難水果姐,給出
m個問題,每個問題要求水果姐從第
x家店出發到第
y家店,途中只能選一家店買乙個水果,然後選一家店(可以是同一家店,但不能往回走)賣出去,求每個問題中最多可以賺多少錢。
輸入描述
第一行n
,表示有n家店
下來n個正整數,表示每家店乙個蘋果的**。
下來乙個整數
m,表示下來有
m個詢問。
下來有m
行,每行兩個整數x和
y,表示從第
x家店出發到第
y家店。
輸出描述有m
行。每行對應乙個詢問,乙個整數,表示面對
cgh的每次詢問,水果姐最多可以賺到多少錢。
樣例輸入
102 8 15 1 10 5 19 19 3 5
46 6
2 82 2
6 3樣例輸出
018
014資料範圍及提示
0<=
蘋果的**
<=10^8
0題解:線段樹儲存最大值、最小值、從左到右的最大差價、從右到左的最大差價。將兩棵子樹合併成一棵子樹是這道題目的關鍵。通過使用update算出父節點的各個值,父節點的最大值即是子節點中的最大值,最小值即是子節點中的最小值,從左到右的最大差價即是左子樹本來的從左到右的最大差價,右子樹本來的從左到右的最大差價,右子樹的最大值減去左子樹的最小值這三者之間的最大值,從右到左的最大差價即是左子樹本來的
從右到左的最大差價,右子樹本來的從右到左的最大差價,左子樹的最大值減去右子樹的最小值這三者之間的最大值,
是op用來記錄是要查詢的是從左往右走,還是從右往左走,最後算出答案即可。
#include #include int n,m,x,y,op;
int a[200005];
struct treet[800005];
tree ans;
const int inf=1e9;
using namespace std;
inline int read()
while ((ch<'0')||(ch>'9')) ch=getchar();
while ((ch>='0')&&(ch<='9'))
return f*x;
}tree update(tree x,tree y)
inline void build(int root,int l,int r)
build(root<<1,l,(l+r)/2);
build(root<<1|1,(l+r)/2+1,r);
t[root]=update(t[root*2],t[root*2+1]);
}inline void find(int root,int l,int r)
if (l<=mid) find(root*2,l,r);
if (r>mid) find(root*2+1,l,r);
}int main()
if (x>y)
ans.mn=inf;
ans.mx=-inf;
ans.ls=ans.rs=0;
find(1,x,y);
if (op) printf("%d\n",ans.rs);
else printf("%d\n",ans.ls);
} return 0;
}
POJ 3304 Segments(計算幾何)
description 給出n條線段,問是否存在一條直線與這n條線段的任一條都相交 input 第一行一整數t表示用例組數,每組用例首先輸入一整數n表示線段數量,之後n行每行四個實數x1,y1,x2,y2分別表示線段兩端點橫縱座標 output 對於每組用例,如果存在一條直線與這n條線段的任一條都相...
poj3304 Segments 計算幾何
poj 3304 最近開始刷計算幾何了 公式好多完全不會 數學不行 幾何不行 記憶力不行 當機 查的題解 就當複習吧 這套專題拿來熟悉一下計算幾何模板 include include includeusing namespace std const double eps 1e 8 int sgn d...
POJ 3304 Segments 簡單幾何
題目大意 給出n條線段,現在問是否存在一條直線,使得所有線段向這條直線的投影存在乙個共同的交點 題目分析 題意有點抽象,需要轉換一下,因為所有的線段向某一條直線的投影存在乙個交點,那麼在那條直線上,從交點位置開始,沿著垂直於直線的方向做另一條直線,會發現這條直線與n條線段都存在乙個交點,也就是都相交...