LightOJ 1085 樹狀陣列 動態規劃

2022-08-31 04:00:09 字數 1230 閱讀 2740

題目鏈結

記\(dp(i)\)為以第i個結尾的上公升子串行的個數,可以得到轉移方程

\[dp(i)=\sum_\),所以求出每乙個\(dp(i)\).

直接求複雜度\(o(n^2)\),自然是不行的。因為只和大小的比較有關係,跟數值本身是無關的,所以先將其離散化。變成1到pos的點。這樣就可以開下乙個樹狀陣列。

樹狀陣列可以很方便的求出前n項和,利用這個性質,可以做到\(o(nlogn)\).

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

typedef pairp;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const double pi = acos(-1.0);

const double eps = 1e-9;

const int n = 1e5 + 5;

const int mod = 1e9 + 7;

int n;

ll c[n];

inline ll lowbit(int i)

void add(int x, ll val)

}ll sum(int x)

return sum;

}int t,kase = 0;

struct node

node(int a, int b)

}node[n];

bool cmp1(node a, node b)

bool cmp2(node a, node b)

mapmp;

int main()

sort(node+1, node+1+n, cmp1);

mp.clear();

int pos = 1;

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

sort(node+1, node+1+n, cmp2);

memset(c, 0, sizeof(c));

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

printf("case %d: %d\n", ++kase, sum(pos-1));

}return 0;

}

lightoj 1085 離散化 樹狀陣列

題意 計算乙個序列裡有多少個上公升子串行 思路 先離散化一下,按照值排序,如果相同的就按照座標從大到小排序,這樣就可以避免重複計算。樹狀陣列存的是以a i 結尾的子串行之和 dp a i sigma a i 1 1 ok,還是很簡單的 include using namespace std type...

LightOj 1188 樹狀陣列

題意 給乙個數列 len 1e5 數列裡的數 num 1e5 現有q次詢問 1e5 詢問某個區間的不同的數有多少個。思路 明顯的樹狀陣列統計,自己寫的時候不太清楚那個樹狀陣列到底應該怎麼維護。有點想用掃瞄線類似的思想,然後離線所有詢問這樣去維護,甚至想到了按照右區間排序。但是到底樹狀陣列應該怎樣維護...

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...