題目:
一開始咋都想著得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...