題目
在成都的一條街道上,一共有 n其實只需要維護字首和就行了,維護乙個x[i]*dis[i]和乙個x[i];'>n
n戶人家,每個家庭有 x
i'>xi
xi 個人,他們和諧的生活在 一起,作為全國和諧街道,他們經常會小範圍組織活動,每次活動會選擇一戶作為聚點, 並要求某些家庭參加,為了方便通知,村長每次邀請位置連續的家庭。因為每戶人數不 同,每個家庭之間有一定距離,村長希望你計算出每次邀請的家庭的移動代價。第 i
'>i
i個家 庭移動到家庭 j
'>j
j的代價是:xi∗
dis(
i,j)
'>xi∗dis(i,j)
xi∗dis(i,j)di
s(i,
j)'>dis(i,j)
dis(i,j)表示i
'>i
i 到j
'>j
j的距離,村長一共安排了 m
'>m
m 次聚會,每次邀請[li
,ri]
'>[li,ri]
[li,ri]的家庭參加
輸入第一行兩個數表示 n,m
第二行 n-1 個數,第 i 個數表示第 i 個家庭與第 i+1 個家庭的距離 di
第三行 n 個數,表示每個家庭的人數 xi
之後 m 行每行三個數 x l r,表示查詢要把區間 [l,r]的家庭移動到 x 點的代價和
輸出對於每個詢問輸出乙個數表示答案,對 19260817 取模
樣例輸入
5 52 3 4 5
1 2 3 4 5
1 1 5
3 1 5
2 3 3
3 3 3
1 5 5
樣例輸出
1257290
70提示
對於 30%的資料, n,m≤1000
對於另外 20%的資料,所有家庭間的距離都為 1
對於另外 20%的資料,所有家庭人數都為 1
對於 100%的資料 , n,m≤200000;xi,di <=2*10^9
我們只需要考慮三種情況:
目標在區間左邊的時候:ans=σb[i]*x[i]-bσx[i];
目標在區間右邊的時候:ans=bσx[i]-σb[i]*x[i];
目標在區間內部的時候:分左右兩邊分別考慮;
o(n)就可以做出來了
但是考場上沒有看出來,寫了個線段樹,維護區間所有人到區間兩端的花費,這樣每次詢問logn就可以解了,但是很複雜,**詳細看吧
o(n)正解
#include #includeusing
namespace
std;
typedef
long
long
ll;
const ll mod = 19260817
; const
int maxn = 200010
; int
n, m;
ll d[maxn], a[maxn];
ll sum_a[maxn], sum_d[maxn], sum_mul[maxn];
ll calc_ans(
int x, int l, int r, bool
left)
intmain()
for (int i=1; i<=n; i++)
for (int i=1, x, l, r; i<=m; i++)
return0;
}
我自己的**
#includeusingnamespace
std;
#define lc u*2
#define rc (u*2)+1
#define mid (l+r)/2
#define mod 19260817
#define ll long longinline ll read()
ll tot[
800050],m,y,d[200050],n[200050],lv[800050],rv[800050],sum[800050];//
lv(rv):當前區間所有人走到區間最左(右)邊的
inline void buildtree(int u,int l,int
r) buildtree(lc,l,mid);
buildtree(rc,mid+1
,r);
lv[u]=lv[rc]+lv[lc]+((tot[r]-tot[mid]+mod)%mod)*(sum[mid+1]-sum[l]+mod)%mod;//
合併線段樹
lv[u]%=mod;
rv[u]=rv[lc]+rv[rc]+((tot[mid]-tot[l-1]+mod)%mod)*(sum[r]-sum[mid]+mod)%mod;
rv[u]%=mod;
}inline ll findl(
int u,int l,int r,int st,int des)//
找區間內所有點到最左邊的花費
inline ll findr(
int u,int l,int r,int st,int des)//
區間所有點到區間最右邊的花費
inline ll query(
int u,int l,int r,int st,int des,int
to)
else
if(des<=to)
else
}int
main()
return0;
}
NOIP模擬 聚會
描述 在成都的一條街道上,一共有 nn戶人家,每個家庭有 xixi 個人,他們和諧的生活在 一起,作為全國和諧街道,他們經常會小範圍組織活動,每次活動會選擇一戶作為聚點,並要求某些家庭參加,為了方便通知,村長每次邀請位置連續的家庭。因為每戶人數不 同,每個家庭之間有一定距離,村長希望你計算出每次邀請...
NOIP模擬 修路
這題第一眼看上去有些懵逼,還以為是dp。第二眼,哦,這麼裸的最小生成樹,2分鐘打完,拍都沒對,自信100分。最終100分。每條邊的權值減去連個節點的權值,所有的邊做一次最小生成樹就好了。include include include include include define fo i,a,b f...
NOIP模擬 項鍊
經過一番周折,bob找到了alice,為了安慰alice驚魂未定的心,bob決定給alice買一條手鍊,這條手鍊由m個珍珠組成,每個珍珠上刻著不同的小寫字母。當alice看到一些字母按照一定的順序排列成的字串時,就會產生一定的愉悅值。bob現在可以在這m個珍珠上刻上字母,現在他想知道,如何刻字母可以...