題目鏈結
給出乙個數列,讓求長度為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...