daily 练习

发布时间 2023-03-26 21:49:36作者: wrong,anser

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] 大小排序(贪心),然后遍历直到不能再加即可得到答案。