(CodeForces) Round #547 (Div. 3) (全)

本文解析了六道编程挑战题目,涉及算法设计、数据结构处理等关键技能。通过具体的代码实现展示了如何解决这些问题,包括最大连续休息时间的计算、序列恢复及彩色靴子配对等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应该没人来看了吧,就贴个代码了

A - Game 23

#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define fi first
#define se second
#define ms(_data,v) memset(_data,v,sizeof(_data))
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
ll n,m;
int main() {
	std::ios::sync_with_stdio(0);
	cin>>n>>m;
	if(m<n || m%n!=0)	cout<<-1<<endl;
	else if(m==n)	cout<<0<<endl;
	else {
		ll num=0,t=m/n;
		while(t%2==0) {
			t/=2;
			num++;
		}
		while(t%3==0) {
			t/=3;
			num++;
		}
		if(t!=1)	cout<<-1<<endl;
		else	cout<<num<<endl;
	}

	return 0;
}

B - Maximal Continuous Rest

#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define fi first
#define se second
#define ms(_data,v) memset(_data,v,sizeof(_data))
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=2e5+5;
int a[maxn*2],n;
int main(){
	std::ios::sync_with_stdio(0);
	cin>>n;
	for(int i=1;i<=n;++i)	cin>>a[i],a[i+n]=a[i];
	int ans=0,i=1,tp=0;
	while(i<=2*n){
		if(!a[i]) ++i;
		else{
			tp=0;
			while(a[i++])	tp++;
			ans=max(ans,tp);
		}
	}
	ans=max(ans,tp);
	cout<<ans<<endl;
	return 0;
}

C - Polycarp Restores Permutation

#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define fi first
#define se second
#define ms(_data,v) memset(_data,v,sizeof(_data))
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=2e5+5;
struct node{int id,num=0;};
map<int,node> mp;
int ans[maxn],n;
int main(){
	std::ios::sync_with_stdio(0);
	cin>>n;
	mp[0].num=1,mp[0].id=1;
	int sum=0,tp;
	bool fg=0;
	for(int i=1;i<=n-1;++i){
		cin>>tp;
		sum+=tp;
		mp[sum].num++,mp[sum].id=i+1;
		if(mp[sum].num>=2){
			fg=1;
		}
	}
	if(fg)	cout<<-1<<endl;
	else{
		int i=1;
		for(auto it=mp.begin();it!=mp.end();++it){
			if(it==mp.begin())	ans[it->se.id]=i++,tp=it->fi;
			else{
				if(it->fi != tp+1){
					cout<<-1<<endl;
					return 0;
				}
				ans[it->se.id]=i++,tp=it->fi;
			}
		}
		for(int i=1;i<=n;++i)	cout<<ans[i]<<" ";
	}
	return 0;
}

D - Colored Boots

#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define fi first
#define se second
#define ms(_data,v) memset(_data,v,sizeof(_data))
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
map<char,vector<int> > le;
map<char,vector<int> > ri;
const int maxn=2e5+5;
string l,r;
int la[maxn],ra[maxn],n;
int main() {
	std::ios::sync_with_stdio(0);
	cin>>n>>l>>r;
	for(int i=0; i<(int)l.size(); ++i) {
		le[l[i]].pb(i+1),ri[r[i]].pb(i+1);
	}
	int num=0;
	for(auto it=le.begin(); it!=le.end(); ++it) {
		if(it->fi=='?' || ri[it->fi].size()==0)	continue;
		while((it->se).size() && ri[it->fi].size()) {
			num++;
			la[num]=(it->se).back(),ra[num]=ri[it->fi].back();
			(it->se).pop_back(),ri[it->fi].pop_back();
		}
	}
	if(le['?'].size()) {
		for(auto it=ri.begin(); it!=ri.end(); ++it) {
			if(it->fi=='?' || it->se.size()==0)	continue;
			while((it->se).size() && le['?'].size()) {
				num++;
				la[num]=le['?'].back(),ra[num]=it->se.back();
				(it->se).pop_back(),le['?'].pop_back();
			}
		}
		while(le['?'].size() && ri['?'].size()) {
			num++;
			la[num]=le['?'].back(),le['?'].pop_back();
			ra[num]=ri['?'].back(),ri['?'].pop_back();
		}
	}
	if(ri['?'].size()) {
		for(auto it=le.begin(); it!=le.end(); ++it) {
			if(it->fi=='?' || it->se.size()==0)	continue;
			while((it->se).size() && ri['?'].size()) {
				num++;
				la[num]=(it->se).back(),ra[num]=ri['?'].back();
				(it->se).pop_back(),ri['?'].pop_back();
			}
		}
	}
	cout<<num<<endl;
	for(int i=1; i<=num; ++i)	cout<<la[i]<<" "<<ra[i]<<endl;
	return 0;
}

E - Superhero Battle

#include<bits/stdc++.h>
typedef long long ll;
ll n;
ll h,d[200010],min,net,i;
int main(){
	scanf("%I64d%I64d",&h,&n);
	for(i=0;i<n;i++){
		scanf("%I64d",&d[i]),net+=d[i];
		if(net<min)min=net;
	}
	if(net>=0&&min+h>0)printf("-1");
	else{
		ll temp=h;
		for(i=0;i<n;i++){
			temp+=d[i];
			if(temp<=0){
				printf("%I64d\n",i+1);
				return 0;
			}
		}
		ll round=(min+h)/(-net);
		while(round*net+h+min>0)round++;
		h+=net*round;
		for(i=0;i<n;i++){
			h+=d[i];
			if(h<=0){
				printf("%I64d\n",i+1+round*n);
				return 0;
			}
		}
	}
	return 0;
}

F - Same Sum Blocks

#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define fi first
#define se second
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define sc(n) scanf("%d",&n)
#define SC(n,m) scanf("%d %d",&n,&m)
#define sz(a) int((a).size())
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=1e3+505;
int sum[maxn],n; 
struct node{
	int l,r;
};
bool cmp(node x,node y)	{return x.r<y.r;}
map<int,vector<node> >num;
int main(){
	std::ios::sync_with_stdio(0);
	cin>>n;
	rep(i,1,n)	cin>>sum[i],sum[i]+=sum[i-1];
	rep(i,1,n)	rep(j,i,n)	num[sum[j]-sum[i-1]].pb(node{i,j});
	int cnt=0;
	vector<node> ans;	
	for(auto it=num.begin();it!=num.end();++it){ //去除区间叠加的 
		vector<node> &tp=it->se;
		sort(tp.begin(),tp.end(),cmp);
		vector<node> tt;
		int nr=-1,count=0;
		rep(i,0,sz(tp)-1){
			if(tp[i].l>nr)	count++,nr=tp[i].r,tt.pb(node{tp[i].l,tp[i].r});
		}
		if(count>cnt)	ans=tt,cnt=count;
	}
	cout<<sz(ans)<<endl;
	rep(i,0,sz(ans)-1)	cout<<ans[i].l<<" "<<ans[i].r<<endl;
	return 0;
}

G - Privatization of Roads in Treeland

#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define fi first
#define se second
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define sc(n) scanf("%d",&n)
#define SC(n,m) scanf("%d %d",&n,&m)
#define sz(a) int((a).size())
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=2e5+5;
struct node{int id,to;};
vector<node> eg[maxn];
int n,k,in[maxn],ans,col[maxn];
void dfs(int np,int fa, int st){
	rep(i,0,sz(eg[np])-1){
		if(eg[np][i].to==fa)	continue;
		if(st>ans)	st-=ans;
		col[eg[np][i].id]=st;
		dfs(eg[np][i].to,np,st+1);
		st++;
	}
}
int main(){
	std::ios::sync_with_stdio(0);
	cin>>n>>k;
	for(int i=1,x,y;i<=n-1;++i){
		cin>>x>>y;
		in[x]++,in[y]++;
		eg[x].pb(node{i,y}),eg[y].pb(node{i,x});
	}
	sort(in+1,in+n+1,greater<int>() );
	ans=in[k+1];
	dfs(1,0,1);
	cout<<ans<<endl;
	rep(i,1,n-1)	cout<<col[i]<<" ";
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值