POJ 1990(樹狀陣列)

2021-06-28 19:40:26 字數 877 閱讀 8711

題目:

一開始咋都想著得n*n,畢竟pair在那擱著來,看了題解才知道原來可以用樹狀陣列:

對於每個cow[i]來說,由它的v[i]決定的有兩部分,左邊部分和右邊部分,如果把cow關於v公升序排列,逐個求得由每個cow[i]決定的volume,就可以復用前面的計數了

#include #include #include #include using namespace std;

#define max 20005

typedef pairpii;

typedef long long ll;

int n, m;

pii cow[max];

ll c[2][max] = ;

/* 對每乙個cow來說,由他決定的部分有兩塊:

(1)左邊小於等於他的個數*他的位置 - 左邊小於等於他的距離和

(2)右邊小於等於他的距離和 - 右邊小於等於他的個數*他的位置

*/inline int lowbit(int x)

void update(int i, int x, int v)

}ll sum(int i, int x)

ll query(int i, int x, int y)

int main()

sort(cow, cow + n);

memset(c[0] + 1, 0, m * sizeof(ll));

memset(c[1] + 1, 0, m * sizeof(ll));

ll tot = 0;

for(int i = 0; i < n; ++i)

printf("%lld\n", tot);

} return 0;

}

poj 1990 樹狀陣列

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

POJ1990 樹狀陣列)

對於樹狀陣列的理解不透 不會轉化 題解 顯然是要按照v排序的,那麼首先在on情況下是可以完成max vi,vj 的操作,對於某個牛i,我們只需考慮i之前的,那麼i之前的牛我們需要知道每只牛j abs dis i dis j 去掉絕對值後,我們只需要知道所有dis j dis i 的牛的x的和 sum...

poj1990(樹狀陣列好題)

思路請參考 下面是我的 include include include include include include include include include include include define ll int64 define n 20005 define inf 0x7fffff...