0%

思路讲解

很复杂?很难?其实枚举就好了。

AC代码

https://acm.hdu.edu.cn/contest/view-code?cid=1176&rid=11903

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

思路讲解

image

离AC之差一步之遥。

那为什么要倒着遍历那?说实话,我也不知道。

这个是

证明:上述过程相当于,一开始将所有的左括号放在前 n 个位置,即字
典序最小的合法括号串。当枚举到的区间带来硬性需求时,我们将最靠
右的左括号移动到当前区间的左端点。这样的操作显然是最优的。时间
复杂度 O(n + m log m)。

AC代码

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=78588028

还有一种树状数组解法。

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

思路讲解

精髓在于猜这个你随机跳到其他位置以后,再跳到终点N+1的期望成本,可以设这个东西位S,用这个S算出来的S,我们叫做g(S)。那么 g(S)=Sg(S)=S 那是必须的,但是我们猜的不等于怎么办呢?

于是我们就二分。

至于这个二分的收敛方向嘛,我试着推了一下,我的建议是都试试。guess嘛。

image

这个图把y=x画的太斜了,实际上在y=x的下面,g(S)<Sg(S)<S,需要向左移动(也就是even<mid,r=mid)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 从x到N+1的最小期望成本
vdb dp(N+5);
DB l=0,r=accumulate(all(A),0ll)+accumulate(all(B),0ll);
FOR(_,1,100){
DB mid=(l+r)/2;
dp[N]=min((DB)A[N-1],mid+B[N-1]);
ROF(i,N-1,1){
dp[i]=min(dp[i+1]+A[i-1],mid+B[i-1]);
}
DB even=0;
FOR(i,1,N){
even+=dp[i];
}
// 包含位置 N+1 的 f=0(随机游走位置是包含N+1的)
even/=(N+1);
// 如果答案有问题,可以先换一下收敛方向
// 我们要尽可能的减少这个even与这个mid之间的差
if(even>mid){
l=mid;
}else{
r=mid;
}
}

AC代码

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

思路讲解

赛后自己想出来了

核心代码是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FOR(i,1,N){
if(cnt[i]==0) continue;
diff[cnt[i]+1]-=1;
diff[1]+=1;
}
// 这个sum维护的就是出现次数
// Sum[i] 表示出现次数大于等于i的数有Sum[i]个
vll Sum(N+5);
FOR(i,1,N){
Sum[i]=Sum[i-1]+diff[i];
}
ll ans=jichu;ll lans=jichu;
FOR(i,2,N){ // 枚举分为i条链的情况
if(Sum[i]<=1) break;
lans+=(Sum[i]-1)*X;
lans-=Sum[i]*Y;
lans+=Z;
ans=max(lans,ans);
}

AC代码

https://acm.hdu.edu.cn/contest/view-code?cid=1175&rid=12705

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