牛客練習賽56 小魂和他的數列

2021-10-01 19:50:28 字數 1783 閱讀 5836

題目鏈結

給出乙個數列,讓求長度為k的嚴格遞增子串行有多少個

怎麼做呢?

顯然dp 這個是很好想的

for

(int i=

1; i <= n; i ++

)for

(int i =

2; i <= m; i ++)}

}}

這個dp顯然tle 所以 當時沒有做出來。 做到這裡不會做了。。

想不到怎麼優化。

顯然在最裡面的那個迴圈的作用是字首和 (小於a[i]的位置的dp的字首和)

於是你得想到樹狀陣列優化。。 我太菜了想不到

開k個樹狀陣列優化最裡面的那一層迴圈

於是就得到先離散化再根據他的值加進去 再求字首和加到dp裡的操作

於是就寫了個這個:

for

(int i =

1; i <= n; i ++

) l = vv.

size()

;for

(int i=

1; i <= n; i ++

)for

(int i =

2; i <= m; i ++

)}

本來只能過60% 加個vis陣列預處理了一下離散化後的值

能過85%

可是這又不是他媽的oi賽制

**:

#include

#include

#include

using

namespace std;

const

int mod =

998244353

;const

int maxn =

5e5+5;

int a[maxn]

;int dp[maxn][11

];int tree[maxn][11

];int l;

intlowbit

(int x)

void

add(

int x,

int f,

int num)

}int

query

(int x,

int f)

return ans;

}vector<

int> vv;

int num[maxn]

;int vis[maxn]

;int temp[maxn]

;int

main()

sort

(vv.

begin()

,vv.

end())

; vv.

erase

(unique

(vv.

begin()

,vv.

end())

,vv.

end())

;for

(int i =

1; i <= n; i ++

) l = vv.

size()

;`` for

(int i =

1; i <= n; i ++

)for

(int j =

2; j <= m; j ++)}

int ans =0;

for(

int i =

1; i <= n ; i++

)printf

("%d\n"

,ans%mod)

;}

牛客練習賽56 B 小琛和他的學校

思路 一條路可把圖分為左右兩部分。l ci,l peo,r ci,r peo,w 分別為左邊城市數和人數,右邊城市數和人數,該路的費用。我們知道,左邊的人要去右邊的r ci個城市,右邊的人要去左邊的l ci個城市,那麼該路的費用就是 cost 2 w l ci r peo r ci l peo 注意...

小魂和他的數列

題目描述 一天,小魂正和乙個數列玩得不亦樂乎。小魂的數列一共有n個元素,第i個數為ai。他發現,這個數列的一些子串行中的元素是嚴格遞增的。他想知道,這個數列一共有多少個長度為k的子串行是嚴格遞增的。請你幫幫他,答案對998244353取模。對於100 的資料,1 n 500,000,2 k 10,1...

牛客練習賽56 C

預處理出該序列中的每個數是第幾大的,然後依次按照大小插入到樹狀陣列中,沒插入乙個數字,就判斷現在在陣列中的數比當前數小的數有多少個,讓後逐層更新一下,更新k層,最後把低k層的數加起來即可。include include using namespace std typedef long long ll...