首页 > 其他分享 >Codeforces Round 887 (Div. 2) A-D

Codeforces Round 887 (Div. 2) A-D

时间:2023-07-25 13:23:27浏览次数:47  
标签:... 887 题意 删除 int Codeforces ++ 数组 Div

Codeforces Round 887 (Div. 2)

A. Desorting

题意:给出一个数组,可以进行任意次以下操作:

选择一个i

对于数组中的a[1],a[2],...,a[i]全部+1

a[i+1]...a[n]全部-1,

问最小使得数组变得无序的操作是多少次

Solution

直接找相邻的两个数的最小的差值即可

void solve()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	int res=INF;
	for(int i=1;i<n;i++)res=min(a[i+1]-a[i],res);
	if(res<0)
	{
		cout<<"0\n";
	}else
	{
		if(res&1)
		{
			cout<<(res+1)/2<<"\n";
		}else cout<<res/2+1<<"\n";
	}
}

B. Fibonaccharsis

题意:给出n,k,问有多少对x,y(x<=y),使得n是以这两个数为a[1],a[2]的斐波那契数列的第k个数

Solution

对于第k个数我们可以预处理出来它是由x[k]个a[1]和y[k]个a[2]组成的,由于a[1]<=a[2],这样我们可以得到a[1]的上限

我们找到第一个满足的最小的a[1],然后每次往后可以加上lcm(x[k],y[k])个a[1],以此保证最小

void solve()
{
	int n,k;cin>>n>>k;
	if(k>pos)
	{
		cout<<"0\n";
		return;
	}
	if(n<x[k]&&n<y[k])
	{
		cout<<"0\n";
		return;
	}
	int ans=0;
	int l=0,r=0;
	int lmax=n/(x[k]+y[k]);
	
	//cout<<lmax<<"\n";
	while(n>0&&n%y[k]!=0)
	{
		n-=x[k];
		l++;
		
	}
	r=n/y[k];
	ans++;
	if(l>r)
	{
		cout<<"0\n";
		return;
	}
	int z=lcm(x[k],y[k]);
	
	
	//cout<<z/x[k]<<"\n";
	ans+=(lmax-l)/(z/x[k]);
	cout<<ans<<"\n";
	
}

C. Ntarsis' Set

题意:给出n,k,和一个长为n的数组a,有一个集合,包含了从1到101000,每一轮删除掉第a[1],a[2],...,a[n]个数,问最后剩下的数里面最小是多少

Solution

模拟一遍删除的过程,我们来看这样一个图

我们考虑每一个位置应该删掉哪些数,对于1到x之间的,只会由1来删除,1每次删除的位置都会+1,很容易理解,而对于x到y之间的,会由1和x删除,而x每次删除的位置都会+2,因为对于每一个x到y之间的数来说,他们的位置都在-2,要想删除第x个数,每次都必须+2,同理y到z之间的数每次y都会删除y+3的位置的数

也就是会呈现以下的情况

可能根据x,y之间的数量不同,呈现的结果也不同,但是归根到底,我们可以发现,每跨越一个a[i],需要删除的下一个位置的距离就会+1,假设第k次删除的位置是pos,下一次跨越需要dis,那么很显然答案就是pos+dis

void solve()
{
	int n,k;cin>>n>>k;
	set<int>st;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		
	}
	if(a[1]!=1)
	{
		cout<<"1\n";
		return;
	}
	int num=0;
	
	int pos=1;
	int cnt=0;
	int nex=0;
	while(cnt!=k)
	{
		while(nex+1<=n&&pos+nex>=a[nex+1])
		{
			nex++;
		}
		pos+=nex;
		cnt++;
		//cout<<pos<<" ";
	}
	cout<<pos<<"\n";
}

D. Imbalanced Arrays

题意:给出一个数组a,构造一个数组b,使得对于每一个i,有a[i]个j满足b[i]+b[j]>0,并且不存在b[i]+b[j]=0,0<=a[i]<=n,-n<=b[i]<=n

Solution

首先a[i]越大,b[i]越大

将a排序一下,两边从n开始构造

这样保证构造b[l]时能小于所有b[r+1,...n]的情况下,并且构造b[r]时,b[l,l+1,...,n]都小于等于b[r]

如果当前能满足构造的需求的话则可以,如果都无法满足的话则无法完成构造

struct node
{
	int x,y;
	bool operator < (const node&t)const &{
		if(x!=t.x)return x<t.x;
		else return y<t.y;
	}
}b[N];
int c[N];
int ans[N];
 
void solve()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		b[i].x=a[i];
		b[i].y=i;
	}
	sort(b+1,b+1+n);
	//for(int i=1;i<=n;i++)cout<<b[i].x<<" \n"[i==n];
	
	int pos=n;
	int l=1,r=n;
	while(l<=r)
	{
		if(b[l].x==n-r)
		{
			ans[b[l++].y]=-(pos--);
			continue;
		}
		if(b[r].x==n-l+1)
		{
			ans[b[r--].y]=pos--;
			continue;
		}
		cout<<"NO\n";
		return;
	}
	cout<<"YES\n";
	for(int i=1;i<=n;i++)
	{
		cout<<ans[i]<<" \n"[i==n];
	}
}

标签:...,887,题意,删除,int,Codeforces,++,数组,Div
From: https://www.cnblogs.com/HikariFears/p/17579645.html

相关文章

  • Educational Codeforces Round 71 (Rated for Div. 2)
    EducationalCodeforcesRound71(RatedforDiv.2)A-ThereAreTwoTypesOfBurgers思路:价格高的优先取#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong//#defineint__int128typedefpair<int,int>PII;typedefpair<string,int&......
  • 题解 Codeforces Round 887 (Div 1+Div 2) / CF1853AB,CF1852ABCD
    下大分!悲!Div1只过了1A!!!但还是补完整场Div2吧。A.Desortinghttps://codeforces.com/problemset/problem/1853/Aproblem用操作:\([1,i]++,[i+1,n]--\),使得数组不单调不降,求最小操作次数。\(n\leq10^5\)。solution操作等同于在差分数组上选出\(i\),做\(c_1:=c_1+1,c_i:......
  • Codeforces Round #887 Div.2 A-E
    CodeforcesRound#887Div.2一定要手玩哦前言:一定要手玩,一定要手玩!我今早一手玩发现C很TM简单,如果赛时我能切C说不定直接上1800.。。。时隔多年,我的CodeforcesRating(1718)再次超越了@cqbzlhy(1674)!!!赛时错误:B题出得太慢了->劣于pzj半小时。%%%pzjC没有手玩,瞪眼半天......
  • UESTC 2023 Summer Training #13 Div.2
    Preface开始裸泳咯这个A题给我写的头皮发麻,后面发现我就是个智障儿童比赛的时候E题想了半天感觉天皇老子来了也是\(\frac{1}{n^2}\),赛后发现我是小丑感觉中间做J的时候因为看错题目浪费了很长时间,不过再给一个小时思博题该不会还是不会A.PainttheMiddle比赛的时候一眼贪......
  • Codeforces Round #885 数学专场
    妙,我只能说妙。今天补DEF发现除了F诡秘的杨辉三角,我都能独立做出来。但为什么我感觉DE难度不如C!!!!A题意:一个人站在\((x,y)\)处,而其他人分别在\((x_1,y_1)\dots(x_n,y_n)\),每一次这个人先移动一步到上下左右四个格子,然后其他\(n\)个人再移动一步,求是否永远这个人与其他人不......
  • Codeforces Round 887 (Div. 2)记录
    A.Desorting如果有$a_1\leqa_2\leq\ldots\leqa_{n-1}\leqa_n$,则称长度为$n$的数组$a$已排序。Ntarsis有一个长度为$n$的数组$a$。他可以对数组进行一种操作(0次或多次):-选择一个索引$i$($1\leqi\leqn-1$)。-将$1$加到$a_1,a_2,\ldots,a_i$。-用$a_{......
  • Codeforces Round 887(Div 2)(A-C)
    A.Desorting题目里说的无序是指后面的一个数大于前面一个数,所以只要有一个a[i+1]-a[i]<0就说明已经符合题目的无序要求了,不需要改变即可,即输出0如果有该序列是非严格递增的根据题目所说的改变就只需要求出最小的差值即可,最后用最小的差值除以2(因为每次可以让选中的部分之前的......
  • 【题解】Imbalanced Arrays - Codeforces 1852B
    出处:CodeforcesRound887链接:https://codeforces.com/problemset/problem/1852/B题目大意:给定一个包含\(n\)个非负整数的频次序列\(f\)。构造任意一个等长的整数序列\(b\),要求①\(b\in[-n,n]\)but$b\neq0$②\(b\)中不存在相反数③对于每个坐标\(i\)......
  • Codeforces Round 886 (Div. 4)
    Dashboard-CodeforcesRound886(Div.4)-CodeforcesA.ToMyCritics判断任意两个大于10即可#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=2e5+10;signedmain(){ios::sync_with_stdio(false);cin.tie(nullptr);......
  • 【题解】Ntarsis' Set - Codeforces 1852A
    出处:CodeforcesRound887链接:https://codeforces.com/problemset/problem/1852/A题目大意:给定一个包含\(n\)个正整数的表示删除位置的严格升序序列\(p\),以及另外一个连续正整数的被删除的无穷序列\(l\)。进行\(k\)次删除操作,每次操作从无穷序列\(l\)中同时删除位......