首页 > 其他分享 >CF 977 Review

CF 977 Review

时间:2024-10-06 17:32:53浏览次数:1  
标签:977 10 int Review CF re while wr void

CF 977 Review

掉大分了,我去,绿名也是可以掉分的,我去你简直太牛了sgh。

我是真正的飞舞。

A

排序以后贪心或者直接优先队列模拟即可,都可以过。

Code

#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void re(T &x)
{
	x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	x*=f;
} 
template<typename T>inline void wr(T x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)wr(x/10);
	putchar(x%10^48);
}
int n,m,k;
int main()
{
	int T;
	re(T);
	priority_queue<int,vector<int>,greater<int>> q;
	while(T--)
	{
		re(n);
		int tmp;
		for(register int i=1;i<=n;++i)re(tmp),q.push(tmp);
		for(register int i=1;i<=n-1;++i)
		{
			int x=q.top();q.pop();
			int y=q.top();q.pop();
			q.push((x+y)/2);
		}
		wr(q.top()),putchar('\n');
		q.pop();
	}
	return 0;
}

B

分析

给定一个序列 \({a_n}\) 和 \(x>0\) ,可以任意次数的将序列中的任意一个数加上 \(x\) ,求在最优操作下序列 mex 的最大值。

需要明确的是我们一定是要尽可能地让较小的数都能够存在。

因为只能执行加的操作 ,所以达成这一目的一定是要把 多余的 并且 更小的 数进行操作得到的。

那么我们只需要把序列sort一遍然后模拟即可,注意一遍模拟一遍检查是否出现答案,还要记录当前数字的个数。

复杂度 \(O(n\log n)\) 可以通过。

Code

#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void re(T &x)
{
	x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	x*=f;
} 
template<typename T>inline void wr(T x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)wr(x/10);
	putchar(x%10^48);
}
int n,x;
int a[200010]; 
int main()
{
	int T;
	re(T);
	while(T--)
	{
		set<int> s;unordered_map<int,int> CNT;
		re(n),re(x);
		for(register int i=1;i<=n;++i)re(a[i]);
		sort(a+1,a+n+1);
		int cnt=1;
		a[n+1]=-1;
		for(register int i=1;i<=n;++i)
		{
			if(a[i]==a[i+1])
				cnt++;
			else 
			{
				s.insert(a[i]);
				CNT[a[i]]=cnt;
				cnt=1;
			}
		}
		int las=-1;
		for(auto it:s)
		{
			if(it-las>=2){wr(las+1),putchar('\n');goto A;}
			if(CNT[it]>1)
			{
				if(!s.count(it+x))s.insert(it+x); 
				CNT[it+x]+=CNT[it]-1;
			}
			las=it;
		}
		wr(las+1),putchar('\n');
		A:continue;
	}
	return 0;
}
/*
1
6 1
1 3 4 1 0 2
*/

C(easy)

题意不多赘述,因为太难赘述了。

分析

先看一组样例 :

a:1 2 3 4

b:1 2 3 4   2 3 4 1   2 3 1 4

你会发现只要前四个能够匹配上,好像后面一定能够满足。

那如果我后面八个再写杂乱无章一点,比如 2 1 3 2 1 4 1 2 ,会发现无论怎么写都一定能够满足。

那如果我再写的极限一点:

a:1 2 3 4

b:1 2 3     2 3 4 1  2 3 1 4

这下好像仍然可以,但前四个就不一定一样了。

看看样例里面不合法的一个情况呢?

a:3 1 4 2 5
b:3 1 4 5 2 3 4

这下前三个相同,但是又不合法了,说明和前几位相同实际上没有什么必要的关系。

多举几组反例会发现,b 里面的数字必须按照 a 中的顺序出现,言下之意,当 \(a_i\) 没有第一次出现的时候,\(a_{i+1}\) 就不能先出现,因为此时就不可以通过操作使 \(a_{i+1}\) 出现在 \(a_i\) 前面。

根据以上分析,我们只需要记录每个 \(a_i\) 第一次出现的位置即可。或者说直接按位匹配,不合法就直接输出。

(写的时候差临门一脚了,还是自己太笨了,脑子转的不够快)

#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void re(T &x)
{
	x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	x*=f;
} 
template<typename T>inline void wr(T x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)wr(x/10);
	putchar(x%10^48);
}
int n,m,q;
const int N=2e5+10;
int a[N],b[N],c[N];
inline void solve()
{
	re(n),re(m),re(q);
	for(register int i=1;i<=n;++i)re(a[i]);
	for(register int i=1;i<=m;++i)re(b[i]);
	int cnt=0;b[m+1]=0;
	for(register int i=1;i<=m;++i)
	{
		if(b[i]==b[i+1])continue;
		c[++cnt]=b[i];
	}
	vector<int> vis(n+10,0);
	for(register int i=1,p=1;i<=cnt;++i)
	{
		if(c[i]==a[p])vis[a[p++]]=1;
		else if(!vis[c[i]])
		{
			puts("TIDAK");
			return ;
		}
	}
	puts("YA");
}
int main()
{
	int T;
	re(T);
	while(T--)
		solve();
	return 0;
}

(去重并不是必要的)

C(hard)

挖个坑

D

这个太难了暂时不补了

E

挖个坑

标签:977,10,int,Review,CF,re,while,wr,void
From: https://www.cnblogs.com/Hanggoash/p/18449226

相关文章

  • 【CodeForces训练记录】Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final
    赛后反思做红温了,太菜了,每题都需要WA几次才能过,B题看到MEX选择性害怕,时间复杂度又算错了A题每次选择一对\(a_i,a_j\)把均值插入数组最后面,要想结果最大,对于两个数求均值,最后的结果一定是小于等于其中的较大值,我们可以考虑如何最大化最后一次操作,想到将最大值保留在最后再......
  • 【VMware VCF】使用 SFTP 服务器备份 VCF 核心组件的配置文件。
    可以定期对VMwareCloudFoundation环境中的相关核心组件(如SDDCManager、NSXManager以及vCenterServer等)创建配置备份,以防止当意外故障或数据丢失时,能够进行恢复。默认情况下,NSXManager组件的备份将创建并存储在SDDCManager设备中内置的SFTP服务器上,建议单独创建......
  • 【VMware VCF】删除 SDDC Manager 映像管理中的集群映像。
    登录SDDCManagerUI,导航到生命周期管理->映像管理,这里显示了由SDDCManager映像管理的集群映像,这些映像可能是从现有vCenterServer集群中提取的,也可能是通过外部导入的映像。你可能会发现,这些列表中的映像只能被添加,无法对其进行删除,至少在WEBUI中是这样的。也许,VMwar......
  • CF1994F Stardew Valley(欧拉回路)
    题意简述给定\(n\)个点\(m\)条边,每条边分为关键边和非关键边,你需要构造一条回路,使得每条边被至多经过一次,而关键边恰好被经过了一次,无解输出-1。保证所有关键边将原图连通。\(n,m\le5\times10^5\)。分析先做一个比较关键的题意转化:求是否可以将图上的一些非关键边删掉,使......
  • CF946G Almost Increasing Array 题解
    题目传送门前置知识最长不下降子序列|权值树状数组及应用解法若将\(\{a\}\)变成严格递增序列,至少需要更改\(n\)减去\(\{a_{i}-i\}\)的最长不下降子序列长度个数。证明对于\(a_{i},a_{j}(i<j)\)若都在最终的严格递增序列里,则有\(a_{i}-a_{j}\lei-j\),即\(......
  • CF 1805 D. A Wide, Wide Graph (*1800) 思维 + 树的直径
    CF1805D.AWide,WideGraph(*1800)思维+树的直径题目链接题意:思路:若当前点到最远的点的距离\(<k\),说明\(x\)自己成为一个联通块。并且我们知道距离任意一点最远的点一定是树直径的一个端点。反之,则与直径端点在同一个联通块。所以一个点要么独立成为联通块......
  • 【VMware VCF】使用 PowerVCF 连接和管理 VMware Cloud Foundation 环境。
    VMware有一个非常强大的命令行工具叫PowerCLI,该工具是基于PowerShell开发的模块,主要用于在Windows环境中连接和管理传统虚拟化解决方案,比如vSphere、vSAN以及NSX等。之所以PowerCLI非常强大,是因为它几乎可以实现这些解决方案WEBUI中的所有管理操作,甚至更多。如果你......
  • CF1648F Two Avenues 题解
    非常好题目,使我代码旋转。思路考虑什么样的边有贡献。我们首先提出原图的一个dfs树。处理出经过关键点的树上路径在每一条树边的经过次数\(v_i\)。我们选点会有以下几种情况。选两条割边\(i,j\),由于割边肯定是树边,所以答案就是\(v_i+v_j\)。选一条只被一条非树边覆盖......
  • 「杂题乱刷2」CF1372D
    题目链接CF1372DOmkarandCircle(*2100)解题思路发现问题等价于在环上砍一刀形成一个序列然后取其中不相邻的数字使得和最大。如果这是一个序列,我们只需要取奇数位上的数字和和偶数位上的数字和的最大值即可。我们发现你砍掉一刀等价于把后缀拿到最前面来。于是我们可以直......
  • 【VMware VCF】使用 SoS 实用程序检查 VCF 环境的运行状态以及收集相关组件的日志信息
    VMwareCloudFoundation解决方案中有一个叫SupportabilityandServiceability(VMwareCloudFoundationPart03:准备Excel参数表。”。同样,这个SoS程序也可以在SDDCManager虚拟机中使用,并且具有更多实用的功能,比如在VCF环境中运行状态检查以及收集相关组件的日志等,下......