D题明天补一下
Untitled
Untitled
2023ICPC合肥
已补E,F,G,J
2024CCPC哈尔滨
已补C,G,M,K,
高斯消元
高斯消元法解线性方程组
Codeforces Round 981 (Div3,A-F)
1 | void solve(){ |
1 | void solve(){ |
C这个题有一点说法,其实想明白什么时候换就可以
从左到n/2的位置每次考虑是否交换当前位置,当i这个位置与i-1的数相同的时候或者n-i+1与其下一个数(就是当前数与其遍历过的上一个数)相同的时候选择交换,可以证明这样操作对答案的增益一定是非负的
证明如下
如果a[i]==a[n-i+1],操作无影响
a[i]!=a[n-i+1],
设交换之前点i对答案的增益为 ans=(a[i]==a[i-1]+a[i]==a[i+1]+a[n-i+1]==a[n-i]+a[n-i+1]==a[n-i+2])
交换之后点i对答案的增益为 ans1=(a[n-i+1]==a[i-1]+a[n-i+1]==a[i+1]+a[i]==a[n-i]+a[i]==a[n-i+2])
最坏情况就是
a[i]==a[i-1]&&a[i]!=a[i+1]&&a[n-i+1]!=a[n-i]&&a[n-i+1]!=a[n-i+2]
a[n-i+1]==a[i+1]&&a[i]==a[n-i]&&a[i]==a[n-i+2]
这样的话,交换之后答案多2,但是这种情况下在下一次交换过程中会被重新满足条件执行交换
综上,一直执行交换,最后求答案即可
1 | void solve(){ |
没啥说的,遇到0就断开一定是最优的
1 | void solve(){ |
E - Sakurako, Kosuke, and the Permutation
每次交换完之后就保证当前位置不再交换,这样顺序从1到n就是最小交换次数
1 | void solve(){ |
递推数列具有模周期性,找到第一个循环节中的下标再乘n即可
1 | void solve(){ |
Codeforces Round 980 (Div2,A-D)
1 | void solve(){ |
1 | void solve(){ |
1 | void solve(){ |
只有答题才能得分,所以跳题相当于花费a[i]从位置i转移到b[i]
答题就是花费0从i转移到i-1
最终答案就是所有能遍历到的位置上的a[i]-cost[i]
b[i]小于等于i时选择跳过是不明智的,因为此时在到达b[i]的过程中通过答题到b[i]能获得的分数一定更大
i 到 j 有两种方法,第一种是 j=b[i],直接从 i 跳到 j ;第二种是 i<j<b[i] ,从 i 跳到 b[i] 再向左答题到 j,两种方法的花费都是a[i],
所以我们遍历所有位置,每次取能到当前位置且花费最小,转移到当前位置求每个能遍历到的位置的最小花费
1 | void solve(){ |