首页 > 其他分享 >【CodeForces训练记录】Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)

【CodeForces训练记录】Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)

时间:2024-10-06 16:00:18浏览次数:9  
标签:977 cnt based int long -- add solve Round

赛后反思

做红温了,太菜了,每题都需要WA几次才能过,B题看到 MEX 选择性害怕,时间复杂度又算错了

A题

每次选择一对 \(a_i,a_j\) 把均值插入数组最后面,要想结果最大,对于两个数求均值,最后的结果一定是小于等于其中的较大值,我们可以考虑如何最大化最后一次操作,想到将最大值保留在最后再使用,这样的答案是最优的,所以我们对数组进行排序,操作 \(n-1\) 次即可

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n; cin>>n;
	vector<int> a;
	for(int i = 0;i<n;i++){
		int x; cin>>x;
		a.push_back(x);
	}
	sort(a.begin(),a.end());
	for(int i = 1;i<n;i++){
		a.push_back((a[0]+a[1])/2);
		a.erase(a.begin());
		a.erase(a.begin());
		sort(a.begin(),a.end());
	}
	cout<<a[0]<<endl;
}

signed main(){
	int T; cin>>T; while(T--)
	solve();
	return 0;
}

B题

求最大的 MEX,我们显然只需要考虑值域小于等于 \(n\) 的 \(a_i\) 即可,因为 MEX 需要 \({0,1,2,3,4,5}\) 这样连续的 \({a_i}\) 才行,所以最后的答案一定是 \(\le n\) 的,接下来就是考虑什么时候该对 \(a_i + x\),如果我们找到了连续 \(a_i\) 中有空缺的部分,例如 \({2,3,4,6,7}\) 中间少了 \(5\) ,这时我们就需要从 \(\le 5\) 中找到多次出现的数字 \(a_i\),将其加上 \(k\) 倍的 \(x\),但是对于有些 \(a_i + kx\) 可能出现不等于这个数的情况,这时我们就要维护 \(a_i \mod x\) 的出现次数,我们循环遍历 \(0 \sim n\) ,同时维护一个 \(i \mod x\) 的值,即数字 \(i\) 的出现次数 \(- 1\)(因为还要保留至少一个 \(i\),所以是 \(-1\)),发现空缺的部分(即出现次数为 \(0\))的情况,判断当前 \(i \mod x\) 是否还能加上来,如果不行 MEX 就是 \(i\) 了,可以的话继续遍历下去。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	map<int,int> cnt;
	map<int,int> add;
	int n,x; cin>>n>>x;
	vector<int> a(n + 1);
	for(int i = 1;i<=n;i++) cin>>a[i],cnt[a[i]]++;
	sort(a.begin() + 1,a.end());
	for(int i = 0;i<=n;i++){
		if(cnt[i]>1) add[i%x] += cnt[i]-1;
		if(!cnt[i]&&add[i%x]){
			cnt[i]++;
			add[i%x]--;
			continue;
		}
	}
	for(int i = 0;i<=n;i++){
		if(!cnt[i]){
			cout<<i<<endl;
			break;
		}
	}
}

signed main(){
	int T; cin>>T; while(T--)
	solve();
	return 0;
}

C题

我们发现一旦一个人演示完成后,顺序可以随便改变,所以我们遍历 \({b_i}\) ,如果当前演示的人和要求的匹配的话,就往下,同时标记这个人的顺序可以改变,若出现了之前已经演示过的人就可以直接跳过了。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n,m,q; cin>>n>>m>>q;
	map<int,bool> vis;
	vector<int> a(n + 1);
	for(int i = 1;i<=n;i++) cin>>a[i];
	vector<int> b(m + 1);
	for(int i = 1;i<=m;i++) cin>>b[i];
	int now = 1;
	for(int i = 1;i<=m;i++){
		if(vis[b[i]]) continue;
		if(b[i] == a[now]) vis[a[now]]=1,now++;
		else {
			cout<<"TIDAK"<<endl;
			return;
		}
	}
	cout<<"YA"<<endl;
}

signed main(){
	int T; cin>>T; while(T--)
	solve();
	return 0;
}

标签:977,cnt,based,int,long,--,add,solve,Round
From: https://www.cnblogs.com/longxingx/p/18449140

相关文章

  • WPF ListBoxItem Selected and background changed at the same time via ItemContain
    <Window.Resources><Stylex:Key="lbxItemContainerStyle"TargetType="ListBoxItem"><SetterProperty="Template"><Setter.Value><ControlTemplateTargetType=&quo......
  • 2024.10.5 LGJ Round
    A给定\(n\)个区间,你要选出最多区间对数,使得每一对的区间都不交。\(n\le4e5\)。反悔贪心,我们将所有区间按\(l_i\)从小到大排序,一个一个加入,加入的时候有两种情况。1.之前的区间中存在未匹配的区间,且可以跟当前区间匹配。我们随便选择一个区间跟当前区间匹配即可。2.找不到......
  • 2024.10.5 LGJ Round
    A给定\(n\)个区间,你要选出最多区间对数,使得每一对的区间都不交。\(n\le4e5\)。反悔贪心,我们将所有区间按\(l_i\)从小到大排序,一个一个加入,加入的时候有两种情况。1.之前的区间中存在未匹配的区间,且可以跟当前区间匹配。我们随便选择一个区间跟当前区间匹配即可。2.找不到......
  • pbootcms模板报错提示PHP Warning: Unknown: open_basedir restriction
    当PbootCMS模板出现报错提示 PHPWarning:Unknown:open_basedirrestrictionineffect.File 时,通常是因为PHP的 open_basedir 限制设置不当。以下是解决该问题的简要步骤:解决步骤检查PHP配置文件(php.ini):确认 open_basedir 设置是否正确。修改 open_b......
  • [题解]SFMOI Round I A~C
    Portal:https://www.luogu.com.cn/contest/179008\(\bf{100+50+50+25+5=\color{indianred}225\color{black}\,\rk.\184}\)A-StrangeCakeGame显然对于小W,向下移动蛋糕刀是最有利的;对于小M,向右移动是最有利的。所以双方以最佳状态移动,最终\(x\ley\)的巧克力是小W的。直接......
  • C# - 异步编程 - BackgroundWorker 类
    后台线程,BackgroundWorker类用于创建一个线程,在后台持续运行以完成某项工作,并不时地与主线程通信。BackgroundWorker类的属性,方法与事件。属性:WorkerReportsProgress:设置后台任务是否可以把它的进度汇报给主线程。WorkerSupportsCancellation:是否支持从主线程取消。IsB......
  • Codeforces Round 972 (Div. 2)
    一万一参赛,VP赛时136A.SimplePalindrome简单构造题。字母集是5,相同字母间一定构成若干回文子串。将相同字母排列在一起,则只有相同字母可以构成回文子串。显然,优先添加较少的字母即可。#include<bits/stdc++.h>usingnamespacestd;intT,n;chars[5]={'a','e','i......
  • Educational Codeforces Round 95 (Rated for Div. 2) G. Three Occurrences
    首先我们随机两个数组\(valA_x,valB_x\)。对于数组\(a\),记\(cnt\)表示\(a_i\)在前缀中出现的次数。若\(cnt\equiv0\mod3\),则\(b_i=valA_x\)若\(cnt\equiv1\mod3\),则\(b_i=valB_x\)若\(cnt\equiv2\mod3\),则\(b_i=valA_x\oplusvalB_x\)记\(pre_i\)表示\(b\)的前......
  • Codeforces Round 976 (Div. 2)
    C.BitwiseBalancing(C)先求出\(b-c\)的值,再考虑\(a\)的每个二进制位取0或1对答案的影响。vp的时候不知道为什么错了很多次。voidsolve(){llb,c,d;scanf("%lld%lld%lld",&b,&c,&d);if(b-c>d){printf("-1\n");retur......
  • Codeforces Round 976 (Div. 2)
    一万五参赛,VP赛时629(唐了,E没想出来)A.FindMinimumOperations简单题。注意特判,用除法统计答案即可。#include<bits/stdc++.h>usingnamespacestd;intT,n,k;intmain(){ scanf("%d",&T); while(T--){ scanf("%d%d",&n,&k); if(k==1||n......