MooFest POJ 1990 樹狀陣列

2021-08-29 13:44:50 字數 673 閱讀 5659

傳送門

題意:給出牛的耳聾程度和牛所在的位置,之後求出每兩個牛所能聽到對方的聲音的和,每兩個牛的計算公式為max(vi,vj)*|xi-xj|

題解:首先暴力肯定是不行的,那麼可以按照牛的音量進行從小到大排序,然後維護兩個樹狀陣列,乙個維護此位置之前之後的牛的個數,另乙個維護此位置之前之後的牛的位置之和,之後求和即可.

附上**:

#include#include#includeusing namespace std;

typedef long long ll;

const int maxn=2e4+50;

paircow[maxn];

int n;

ll cnt[maxn],dis[maxn];

int lowbit(int i)

ll sum(ll *bit,int i)

return res;

}ll sum(ll *bit,int from,int to)

void add(ll *bit,int i,ll x)

}int main()

sort(cow,cow+n);

ll ans=0;

for(int i=0;iprintf("%lld\n",ans);

return 0;

}

MooFest POJ 1990 樹狀陣列)

最近學習了一下樹狀陣列,這道題糾結了很久,終究是因為沒有明白樹狀陣列怎麼用。感覺網上許多大神都只是講原理,對於我們這些初學的菜鳥恐怕都被嚇跑了。這裡我就以實用主義說一下使用方法 其實我覺得其原理應該能對我們更有啟發,也許會帶來很多潛在的好處 這裡需要注意的是,bit的實現 中的bit陣列一開始必須清...

poj 1990 樹狀陣列

開始對距離排序 然後果斷的tle了 然後發現應該對power排序,然後我們記錄和更新的是 比x小的個數與距離和,然後每次算的時候,因為按power排序了,當前的pi一定是最大的,所以就能在logdistance的時間內算出來 ac 如下 include include include include...

POJ 1990(樹狀陣列)

題目 一開始咋都想著得n n,畢竟pair在那擱著來,看了題解才知道原來可以用樹狀陣列 對於每個cow i 來說,由它的v i 決定的有兩部分,左邊部分和右邊部分,如果把cow關於v公升序排列,逐個求得由每個cow i 決定的volume,就可以復用前面的計數了 include include in...