對於樹狀陣列的理解不透+不會轉化
題解:顯然是要按照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...