我的做法,想了好久才想出來。
考慮最後答案的情況肯定是非遞增的,所以我們可以從右往左開始填數,每次填完更新一下rrr。
#include
using
namespace std;
typedef
long
long ll;
const
int n=
3e5+
5,m=
2e4+
5,inf=
0x3f3f3f3f
,mod=
1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define pii pair
#define fi first
#define se second
#define pb push_back
int n,k;
int a[n]
,cnt[n]
;int ans[n]
;int
main()
r=min(r,l-1)
;}ll s=0;
for(
int i=
1;i<=k;i++
) s+
=ans[i]
;printf
("%lld\n"
,s);
return0;
}
第二種做法,從前往後計算貢獻。
最開始看能填多少個0
00,即sum
=min
(cnt
[0],
k)
sum=min(cnt[0],k)
sum=mi
n(cn
t[0]
,k)。
這個對答案的貢獻是sum
sumsu
m。因為後面數的貢獻不能超過前面數的貢獻,所以
s um
=min
(sum
,cnt
[i])
sum=min(sum,cnt[i])
sum=mi
n(su
m,cn
t[i]
),然後計算即可。
#include
using
namespace std;
typedef
long
long ll;
const
int n=
3e5+
5,m=
2e4+
5,inf=
0x3f3f3f3f
,mod=
1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define pii pair
#define fi first
#define se second
#define pb push_back
int n,k;
int cnt[n]
,sum;
ll ans;
intmain()
printf
("%lld\n"
,ans)
;return0;
}
關於尺取(雙指標)法的理解
以下關於該方法的理解是出自我在寫相關程式的時候遇到的超出所設定時間範圍的問題的乙個解法。該解法在針對某些特定問題的時候可以減少時間成本,即降低時間複雜度。在某些問題中例如 給定乙個列表a a,b,c,d,e,f 求出乙個目標值 t,該目標值 t 需要從給定的列表中找出三個數相加得到。三個數只能從列表...
寒假刷雙指標《雙指標》
633.平方數之和 難度中等163 給定乙個非負整數c,你要判斷是否存在兩個整數a和b,使得a2 b2 c。示例 1 輸入 c 5輸出 true解釋 1 1 2 2 5示例 2 輸入 c 3輸出 false示例 3 輸入 c 4輸出 true示例 4 輸入 c 2輸出 true示例 5 輸入 c 1...
矩陣快速冪(加法 取min)
早上想寫一些相關的證明,發現自己出了結合律和一些感性認識外,講不出理性的證明。所以只能先給出例題,大家感性的理解一下。cf352e 思路 看完題 解 之後,可以得到乙個推論 放完i個括號之後,最多不會超過2n個左括號未匹配。那麼,先預處理出從i個未匹配的左括號放n個括號之後轉移到j個未匹配的左括號需...