0%

思路讲解

AC代码

心路历程(WA,TLE,MLE……)

思路讲解

AC代码

心路历程(WA,TLE,MLE……)

思路讲解

前两问用二分,贪心解决。

最后一问需要使用双指针+倍增法。

AC代码

https://www.matiji.net/exam/oj/submit-detail/13507760/29/4498/F16DA07A4D99E21DFFEF46BD18FF68AD

心路历程(WA,TLE,MLE……)

调了比较久,最后终于是调出来了。最重要的就是这个倍增的板子,需要从N+1开始遍历。

1
2
3
4
5
6
7
vector<vector<ll> > jump(N+5,vector<ll>(mx_k+2,0));
ROF(i,N+1,1){
jump[i][0]=i<=N?nextPos[i]+1:N+1;
FOR(j,1,mx_k){
jump[i][j]=jump[jump[i][j-1]][j-1];
}
}

思路讲解

那么首先相邻,状态转移只需要考虑最后一个(前缀dp)。

AC代码

https://qoj.ac/submission/1125813

心路历程(WA,TLE,MLE……)

https://qoj.ac/submission/1125736

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//        最大值       次大值
vector<ll> dp(mxw+5,0),dp2(mxw+5,0),col(mxw+5,0);
for(int i=1;i<=N;++i){
vector<ll> prs;
for(int j=W[i];j>1;j/=minp[j]){ // 素因数分解
ll p=minp[j];
prs.pb(p);
}
sort(all(prs));
prs.resize(unique(all(prs))-prs.begin());
for(auto p:prs){
if(col[p]!=C[i]){
dp2[p]=dp[p];
dp[p]+=1;
col[p]=C[i];
}else{
dp2[p]+=1;
}
}
}

思路讲解

这种方式更稳定,精度更高(其实就是用这种方式过了)

1
2
3
4
5
6
7
8
9
10
11
12
      // 方案二:使用固定迭代次数(100次)进行三分搜索。
// 这种方法不依赖eps,更稳定,且100次迭代足以保证精度远高于1e-8。
for(int i=0; i<100; ++i){
DB mid1 = l + (r-l)/3.0; // 推荐用 l + (r-l)/3 的形式,数值上更稳定
DB mid2 = r - (r-l)/3.0;
if(fx(mid1) > fx(mid2)){
l=mid1;
}else{
r=mid2;
}
}
printf("%.11f\n",fx(l));

AC代码

https://codeforces.com/gym/105851/my#

心路历程(WA,TLE,MLE……)