ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Good Bye 2021: 2022 is NEAR ABCDE

2022-01-03 10:02:03  阅读:226  来源: 互联网

标签:Good const int ABCDE Codeforces cin ans else dp


文章目录

A. Integer Diversity

统计所有数字中,绝对值不同的数字的个数,当且仅当绝对值个数小于2时才统计

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=200100;
int n,m,t;
int w[N];
int cw[N];
int main(){
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		for( int i=0;i<n;i++){
			scanf("%d",&w[i]);
		}
		multiset<int>se;
		for( int i=0;i<n;i++){
			int x=abs(w[i]);
			if(x!=0)
				if(se.count(x)<2)se.insert(x);
			if(x==0)
				if(se.count(x)<1) se.insert(x);
		}
		cout<<se.size()<<endl;
		
	}
}

B. Mirror in the String

分类讨论,当字符串开头有两个相同字母时,直接输出两个开头字母,否则输出单调递减字符序列,直到遇到单调递增的序列。
作图分析会更清晰。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=200100;
int n,m,t;
int w[N];
int cw[N];
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		string s;
		cin>>s;
		string ans;
		ans+=s[0];
		int flag=0;
		for( int i=1;i<s.size();i++){
			if(s[i]<*(--ans.end())){
				ans+=s[i];
				flag=1;
			}
			else if(s[i]==*(--ans.end())){
				if(flag==0) break;
				else ans+=s[i];
			}
			else break;
		}
		cout<<ans;
		reverse(ans.begin(),ans.end());
		cout<<ans<<endl;
	}
	return 0;
}

C. Representative Edges

枚举数列中的任意两个点,然后计算斜率,判断多少个点在直线上,注意精度问题。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=200100;
int n,m,t;
int w[N];
int cw[N];
int eq(double x,double y){
	return fabs(x-y)<1e-7;
}
int check( double x,int val,int pos){
	int res=0;
	for( int i=0;i<n;i++){
		if(eq(1.0*w[i]-val,x*(i-pos))) ;
		else res++;
	}
	return res;
}
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		
		for( int i=0;i<n;i++){
			scanf("%d",&w[i]);
		}
		if(n==1){
			cout<<0<<endl;
			continue;
		}
		int ans=inf;
		for( int i=0;i<n;i++){
			for( int j=0;j<i;j++){
				double div=(1.0*w[i]-w[j])/(i-j);
				ans=min(ans,check(div,w[i],i));
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

D. Keep the Average High

题目大意:将一个区间划分为任意个子区间,每个子区间满足:
该区间任意子区间平均值大于x

状态dp
只需讨论最后两个数选与不选,一共四种情况。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=200100;
int n,m,t;
int w[N];
int dp[N][4];//00 0代表后两个都不选,01 1代表后一个选,10 2代表,11 3代表
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		for( int i=1;i<=n;i++){
			scanf("%d",&w[i]);	
		}
		int x;
		cin>>x;
		for( int i=1;i<=n;i++){
			dp[i][0]=max(dp[i-1][0],dp[i-1][2]);
			dp[i][1]=max(dp[i-1][0],dp[i-1][2])+1;
			dp[i][2]=max(dp[i-1][1],dp[i-1][3]);

			if(i==1) {
				dp[i][3]=1;
			}
			else if(i==2){
				if(w[i]+w[i-1]>=x+x) dp[i][3]=2;
				else dp[i][3]=-inf;
			}
			else{
				if(w[i]+w[i-1]>=x+x&&w[i]+w[i-1]+w[i-2]>=x+x+x)
					dp[i][3]=max(dp[i-1][1],dp[i-1][3])+1;
				else if(w[i]+w[i-1]>=x+x)
					dp[i][3]=dp[i-1][1]+1;
				else dp[i][3]=-inf;
			}
		}
		int ans=0;
		for( int i=0;i<4;i++){
			ans=max(dp[n][i],ans);
		}
		cout<<ans<<endl;
		
	}
}

E. Lexicographically Small Enough

数据结构。
假如前面的若干位都相等,要取得最小值,有两种策略,第一种策略是将本位换成比原来为小的数值,第二种策略是将本位换成与原来位相同的数值,然后再递归。
如果暴力实现,每次需要便利一次整个数组,时间复杂度为n*n
可以使用set优化,在logn的时间内找到比原数大或相等的且距离最近的数。
但是在两数相等的情况下,由于交换,数的位置会发生变化,因此需要一个数据结构来维护这个变化量。
维护的方法有很多,可以使用树状数组,线段树,平衡树等。
这里使用平衡树,用平衡树记录每个交换数的原位置。对于每次查询,只需查找后面有几个数被交换到前面,即可计算出位置的改变量。
注意需要开longlong

#include <bits/stdc++.h>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
const ll inf=1e15;
const int N=200100;
int n,m,q;
string s,t;
int cnt[26];
tree<int,null_type,greater<int>,rb_tree_tag,tree_order_statistics_node_update>delete_pos;
int f(int x){
	return x+delete_pos.order_of_key(x);
}
signed main(){
	cin>>q;
	while(q--){
		cin>>n>>s>>t;
		memset(cnt,0,sizeof(cnt));
		delete_pos.clear();
		set<int>se[26];
		for( int i=0;i<s.size();i++){
			cnt[s[i]-'a']++;
			se[s[i]-'a'].insert(i);
		}
		ll ans=inf,cnt_swap=0;
		for( int i=0;i<t.size();i++){
			int x=t[i]-'a',y=s[i]-'a';
			int flag=0;
			for( int j=0;j<x;j++){
				if(cnt[j]){
					ans=min(ans,cnt_swap+f(*se[j].begin())-i);
					flag=1;
				}
			}
			if(cnt[x]){
				flag=1;
				int posx=*se[x].begin(),posy=*se[y].begin();
				delete_pos.insert(posx);
				cnt_swap+=f(posx)-i;
				se[x].erase(se[x].begin());
				cnt[x]--;
			}
			else break;
			if(flag==0){
				break;
			}
		}
		if(ans==inf) printf("-1\n");
		else printf("%lld\n",ans);
		endd:;
	}	
	return 0;
}

标签:Good,const,int,ABCDE,Codeforces,cin,ans,else,dp
来源: https://blog.csdn.net/qq_41729237/article/details/122282503

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有