POJ1990 樹狀陣列)

2021-08-11 11:33:07 字數 1198 閱讀 5011

對於樹狀陣列的理解不透+不會轉化

題解:顯然是要按照v排序的,那麼首先在on情況下是可以完成max(vi,vj)的操作,對於某個牛i,我們只需考慮i之前的,那麼i之前的牛我們需要知道每只牛j ,abs(dis(i) - dis(j)),去掉絕對值後,我們只需要知道所有dis(j) < dis(i)的牛的x的和 sum1,dis(j) > dis(i)的我們可以用總距離 - sum1 ,以及知道< dis(i) 的牛的個數num1,那麼我們變可以用2個樹狀陣列來分別維護了,

於是ans += ((num1 * x - sum1) + ( sum2 - sum1 - (i - num1) * x)))*v;

很巧妙啊

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define ull unsigned long long

#define inf 0x3f3f3f3f

#define mod 1000000007

#define ****() (cout << " ------------------ " << endl)

const

double eps = 1e-6;

const

int maxn = 20000 + 5;

using

namespace

std;

struct node

node(int x_, int v_):x(x_),v(v_){}

bool

operator

< (const node & p) const

}cow[maxn];

ll sum[maxn];

ll num[maxn];

int lowbit(int x)

void add(int x, int c, ll a)

}ll getsum(int x, ll a)

return ans;

}int main()

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

}}

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

poj1990(樹狀陣列好題)

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