NOIP模擬 聚會

2022-08-12 22:12:17 字數 2867 閱讀 2807

題目

在成都的一條街道上,一共有 n

'>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

其實只需要維護字首和就行了,維護乙個x[i]*dis[i]和乙個x[i];

我們只需要考慮三種情況:

目標在區間左邊的時候:ans=σb[i]*x[i]-bσx[i];

目標在區間右邊的時候:ans=bσx[i]-σb[i]*x[i];

目標在區間內部的時候:分左右兩邊分別考慮;

o(n)就可以做出來了

但是考場上沒有看出來,寫了個線段樹,維護區間所有人到區間兩端的花費,這樣每次詢問logn就可以解了,但是很複雜,**詳細看吧

o(n)正解

#include #include 

using

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;

}

我自己的**

#includeusing

namespace

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個珍珠上刻上字母,現在他想知道,如何刻字母可以...