CodeForces 314C 樹狀陣列 dp

2022-08-20 01:24:12 字數 1224 閱讀 3511

//codeforces 314c

//分析:相當於求給定序列的不降子串行的個數,從乙個空序列開始將得到的不降子串行不斷的延長是典型的做法,則dp[i]表示以第 i 個元素結尾的序列

//思路:o(n^2) 的做法,dp[i] = sum(dp[j]]) (a[j] <= a[i] && j <= i),求和過程用掉了 o(n) 的複雜度,用樹狀陣列可以優化成 o(logn),需要先處理出每個元素在原來的序列中的大小順序,最終複雜度 o(nlogn)。

1 #include "

iostream

"2 #include "

cstdio

"3 #include "

cstring

"4 #include "

algorithm"5

using

namespace

std;

6intn;7

structst8

a[100010

];11

inttot;

12bool

cmp_1(st a, st b)

1316

bool

cmp_2(st a, st b)

1720

21 inline int lowbit(int

p)22

25const

int mod = 1000000007;26

27const

int maxn = 100010;28

intt[maxn], element[maxn];

29void add(int p, int

x)3036}

3738 __int64 sum(int

p)39

45return

res;46}

4748

intmain()

4956 sort(a+1, a+1+n, cmp_1);

57 tot = 1

;58 a[1].rank = 1;59

for(i = 2; i<=n; ++i)

65 sort(a+1, a+1+n, cmp_2);

66int

tmp;

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

72 printf("

%d\n

", sum(tot));

73 }

codeforces 739C 線段樹的高階應用

題意,給你乙個序列,有q次操作,每次對乙個區間進行加值,同時要輸出 最長的上公升序列 下降序列 先上公升再下降序列 很明顯能想到的是利用線段樹維護,有很明顯的能想到要維護線段樹的每個區間的左邊界和右邊界的值,並且每個點都有維護四種變化的值,然後就懵逼了。這時候應該想到的是維護每個區間的左右邊界的四種...

CodeForces 896C 珂朵莉樹

傳送門 用set搞的比較神奇的樹吧,玄學時間複雜度,簡潔好寫,無聊學了用來水題再好不過了 include include include include include include include include include include include include define x ...

CodeForces1328E dfs,樹的深度

給出乙個有n個頂點的有根樹,頂點的編號從1到n。樹的根節點編號恒為1。一棵數是具有n 1條邊的聯通圖。給出 m 個詢問。第i個詢問由 k i 個不同的節點 v i 1 v i 2 v i k i 組成.你的任務是判斷是否存在一條從根節點到u的路徑,使得給出的k i個節點要麼在這條路徑上,要麼與該路徑...