Edu144 CD
Dashboard - Educational Codeforces Round 144 (Rated for Div. 2) - Codeforces
C. Maximum Set

思路:要想让集合长度最长,显然令倍数为2,那么可以容易得到最长长度为 log2(r/l)+1log2(r/l)+1log2(r/l)+1。
接下来求个数,首先是所有倍数都为2的集合,上界为 up=r/(1ll<<ci)up = r / (1ll << ci)up=r/(1ll<<ci),ans1=(up−l+1)ans1=(up - l + 1)ans1=(up−l+1)。
其次可以令一个2变成3,比如第四个样例,4 8 16 32 64—>>>4 12 24 48 96。第二个位置2变3。
我们求出这种情况的上界 up1=r/(1ll<<(ci−1))/3up1 = r / (1ll << (ci - 1)) / 3up1=r/(1ll<<(ci−1))/3,ans2=(up1−l+1)∗ci)ans2=(up1 - l + 1) * ci)ans2=(up1−l+1)∗ci)。
然后如果两个2变成3或者一个2变成4,都会导致长度变短所以不可行。
所以最终答案 ans=(ans1+ans2)ans=(ans1+ans2)%modans=(ans1+ans2)。
void solve()
{int l, r;cin >> l >> r;int len = log2(r / l) + 1;int ci = log2(r / l);//2的个数int up = r / (1ll << ci); // 第一个上界ans = 0;ans += (up - l + 1);/* cout << up << ' '; */int up1 = r / (1ll << (ci - 1)) / 3; // 第二个上界if (up1 - l + 1 > 0){ans = (ans + (up1 - l + 1) * ci) % mod; //*ci是因为这种情况所有的2都可以变成3}cout << len << ' ' /* << up << ' ' << x << ' ' */;cout << ans;
}
D. Maximum Subarray

思路:题目要求k个数+x,其他数-x。我们可以先令所有数-x,再选k个数+2*x。
我们考虑 dp[i][j]dp[i][j]dp[i][j] 为前i个数选了j个数,容易得到转移方程:
dp[i][j]=max(dp[i−1][j]+a[i],dp[i−1][j−1]+a[i]+x∗2,0ll)dp[i][j]=max(dp[i-1][j]+a[i],dp[i-1][j-1]+a[i]+x*2,0ll)dp[i][j]=max(dp[i−1][j]+a[i],dp[i−1][j−1]+a[i]+x∗2,0ll) 。
void solve()
{cin >> n >> k >> x;rep(1, i, n){cin >> a[i];a[i] -= x;}rep(0, i, n){rep(i + 1, j, k){dp[i][j] = -1e18;}}ans = 0;rep(1, i, n){rep(0, j, min(i, k)){if (j){dp[i][j] = max({dp[i - 1][j] + a[i], dp[i - 1][j - 1] + a[i] + 2 * x, 0ll});}else{dp[i][j] = max(dp[i - 1][j] + a[i], 0ll);}}}rep(1, i, n){rep(0, j, min(i, k)){if (k - j <= n - i) //注意确保没选的k的个数要小于等于当前未选的总数{ans = max(ans, dp[i][j]);}}}cout << ans;
}