Tokitsukaze and Two Colorful Tapes
https://www.luogu.com.cn/problem/CF1677C
题解:显然置换环,对于每个环单独考虑:对每个点若其为极大值,则其在绝对值和中被+两次,若为极小值,则被-两次,这样即可得到每个环的贡献,最后统计极值总个数即可贪心得到答案。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+100;
int a[N],b[N],c[N],v[N],f[N];
void solve(){
int n;cin>>n;
int cnt=0,tot=0;
for(int i=1;i<=n;i++) cin>>a[i],v[i]=0;
for(int j=1;j<=n;j++) cin>>b[j];
for(int i=1;i<=n;i++){
f[a[i]]=b[i];
}
int ans=0;
for(int i=1;i<=n;i++){
if(v[i]) continue;
int s=i;
int t=0;
while(1){
if(v[s]) break;
v[s]=1;
t++;
s=f[s];
}
if(t%2) cnt++;
}
int k;
if(n%2) k=2,cnt--;
else k=1;
for(int i=k;i<=n-1;i+=2){
c[++tot]=2*i;
}
int p=1;
for(int i=1;i<=cnt;i+=2){
p++;
}
for(int i=p;i<=tot;i++)
ans+=c[i];
cout<<ans<<endl;
}
signed main(){
int T;cin>>T;
while(T--) solve();
}
E. Messages
https://codeforces.com/problemset/problem/1612/E
题解:由于k很小,我们暴力1->20,找出其中的最大期望,对于选取数>20的情况,我们发现dp方程为:f[i,j]=f[i-1][j-1]*(j-1)/j+p[i]/j等价变形为 f[i,j]=f[i-1][j-1]+(p[i]-f[i-1][j-1])/j ,当p[i]>f[i-1][j-1]时必增,故我们可以按照p[i] 大小排序(贪心),然后遍历直到不能再加即可得到答案。