首页 > 其他分享 >Codeforces Round 874 (Div. 3) A-G

Codeforces Round 874 (Div. 3) A-G

时间:2023-05-21 10:13:01浏览次数:53  
标签:题意 int 874 cin Codeforces Solution solve Div void

比赛地址

A. Musical Puzzle

题意:给出一个字符串,求有多少个不同的长度为2的子串

Solution

直接set存即可

void solve()
{
	int n;cin>>n;
	string s;cin>>s;
	set<string>st;
	for(int i=0;i<n-1;i++)
	{
		st.insert(s.substr(i,2));
	}
	cout<<st.size()<<"\n";
}

B. Restore the Weather

题意:给出a,b两个数组,构造出一种组合,使得|a[i]-b[i]|<=k

Solution

直接把a,b数组从小到大排序即可

struct node
{
	int x,y;
	bool operator < (const node &t)const &{
		if(y!=t.y)return y < t.y;
		else return x < t.x;
	}
}e[N];
int ans[N];
int b[N];
void solve()
{
	int n,k;cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		int x;cin>>x;
		e[i].x=i,e[i].y=x;
	}
	for(int i=1;i<=n;i++)cin>>b[i];
	sort(e+1,e+1+n);
	sort(b+1,b+1+n);
	for(int i=1;i<=n;i++)
	{
		ans[e[i].x]=b[i];
	}
	for(int i=1;i<=n;i++)cout<<ans[i]<<" ";
	cout<<"\n";
}

C. Vlad Building Beautiful Array

题意:给出一个数组a,现在要求构造另一个数组b,要求数组b中全为正奇数或者全为正偶数,b[i]可以为a[i]或者a[i]-a[j]

Solution

可以全构造为奇数或者偶数,将数组从小到大排序

对于构造全奇数的情况,对于一个偶数,前面必须要有比它小的奇数

对于构造全偶数的情况,对于一个奇数,前面必须要有比它小的奇数(所以有奇数的话其实是不可能的?)

void solve()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	sort(a+1,a+1+n);
	int ans=1;
	int flag=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i]&1)
		{
			if(!flag)
			{
				ans=0;
				break;
			}
			flag=1;
		}
	}
	if(ans)
	{
		cout<<"YES\n";
		return;
	}
	flag=0;
	ans=1;
	for(int i=1;i<=n;i++)
	{
		if(a[i]&1)
		{
			flag=1;
		}else
		{
			if(!flag)
			{
				ans=0;
				break;
			}
		}
	}
	if(ans)cout<<"YES\n";
	else cout<<"NO\n";
}

D. Flipper

题意:给出一个数组,可以任选一个区间[l,r],将其中的数翻转,然后再将左边的数整体放到区间右边,右边的数整体放到区间左边,求字典序最大的情况

Solution

分情况讨论,因为求字典序最大的,所以跟最大值n的位置脱不了关系

当n的位置在最右边时,要把n放在第一位,那么区间就要包含n,然后向左移动看,如果a[l-1]比a[1]大,那么将l-1加进来的字典序是比不加要大的

当n的位置在最左边,此时无论怎么操作字典序都会变小,我们就要看n-1的位置,如果n-1在最右边,同上一种情况我们可以知道,n-1和n之间的数都比n小,答案就是[n,n],如果n-1在中间位置,答案是[pos-1,pos-1],因为如果多选的话会使得n的位置在更后面

当n的位置在中间,同第一种情况,把左边所有大于a[1]的数都纳入区间

void solve()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	int pos;
	for(int i=1;i<=n;i++)
	{
		if(a[i]==n)
		{
			pos=i;
			break;
		}
	}
	int l,r;
	if(pos==n)
	{
		l=n,r=n;
		while(l-1>=1&&a[l-1]>a[1])l--;
	}else if(pos==1)
	{
		int pp;
		for(int i=1;i<=n;i++)
		{
			if(a[i]==n-1)
			{
				pp=i;break;
			}
		}
		if(pp==n)
		{
			l=n,r=n;
		}else
		{
			l=pp-1,r=pp-1;
		}
	}else
	{
		l=pos-1,r=pos-1;
		while(l-1>=1&&a[l-1]>a[1])l--;
	}
	for(int i=r+1;i<=n;i++)cout<<a[i]<<" ";
	for(int i=r;i>=l;i--)cout<<a[i]<<" ";
	for(int i=1;i<l;i++)cout<<a[i]<<" ";
	cout<<"\n";
}

E. Round Dance

题意:有n个人跳舞,在每一组里每个人有两个相邻的人(如果一组人里面只有两个人跳舞,那么他们相邻的人相同),每个人只记得一个相邻的人,问跳舞的组数最大最小是多少

Solution

并查集求出联通分块数量num,该答案就是最大值,然后再找含有度数不为2的点的连通分块数量cnt,最小值答案是num-max(0,cnt-1)

void solve()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		t[i]=i;
		l[i]=0;
	}
	int cnt=n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(a[i]<i&&a[a[i]]==i)
		{
			continue;
		}else
		{
			l[a[i]]++;
			l[i]++;
		}
		int aa=find(i),b=find(a[i]);
		if(aa!=b)
		{
			t[aa]=b;
			cnt--;
		}
	}
	unordered_map<int,int>mp;
	for(int i=1;i<=n;i++)
	{
		int z=find(i);
		if(l[i]!=2)mp[z]++;
	}
	cout<<cnt-max(0LL,(long long)mp.size()-1)<<" "<<cnt<<"\n";
}

F. Ira and Flamenco

题意:有n个人跳舞,每个学生都有一个等级,要求找到满足以下要求的组的个数

1.该组有且仅有m个学生跳舞

2.每个学生的等级互不相同

3.每个学生的等级差严格小于m

Solution

从条件里面可以看出,满足条件的必须是一个公差为1的等差数列

那我们把它们的等级排序,然后把满足条件的答案加起来即可

int a[N];
struct node
{
	int x,y;
	bool operator < (const node &t)const &{
		if(y!=t.y)return y<t.y;
		else return x<t.x;
	}
}e[N];
void solve()
{
	int n,m;cin>>n>>m;
	
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+1+n);
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		if(cnt==0||a[i]!=e[cnt].y)
		{
			e[++cnt].y=a[i];
			e[cnt].x=1;
		}else
		{
			e[cnt].x++;
		}
	}
	int ans=0;
	int res=0;
	int num=0;
	int last=-1;
	for(int i=1;i<=cnt+1;i++)
	{
		if(last==-1)
		{
			last=e[i].y;
			num++;
			res=e[i].x%mod;
		}
		else if(i==cnt+1||e[i].y-last!=1)
		{
			if(num==m)
			{
				ans=(ans+res)%mod;
			}
			num=1;
			res=e[i].x%mod;
			last=e[i].y;
		}else
		{
			if(num==m)
			{
				ans=(ans+res)%mod;
				res=(res*ksm(e[i-m].x,mod-2))%mod;
				num--;
			}
			res=res*e[i].x%mod;
			last=e[i].y;
			num++;
		}
		//cout<<res<<" ";
		
	}
	//cout<<"\n";
	cout<<ans<<"\n";
	
}

G. Ksyusha and Chinchilla

题意:给出一个树,问删除哪些边可以使得每个点仅属于一个长度为3的枝条

Solution

首先树的大小必须为3的倍数,然后删除的边的个数必须为n/3-1,这样才能保证满足条件

然后我们跑一遍dfs,把遇到大小为3的子树就把他删除,记录删除的边即可

vector<pii>e[N];
int sz[N];
int vis[N];
int dfs(int x,int pre,int id)
{
	int res=0;
	sz[x]=1;
	for(auto it:e[x])
	{
		if(it.first==pre)continue;
		res+=dfs(it.first,x,it.second);
		sz[x]+=sz[it.first];
	}
	if(sz[x]-res==3)
	{
		vis[id]=1;
		res+=3;
	}
	return res;
}

void solve()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		vis[i]=0;
		e[i].clear();
	}
	for(int i=1;i<n;i++)
	{
		int u,v;cin>>u>>v;
		e[u].push_back({v,i});
		e[v].push_back({u,i});
	}
	if(n%3!=0)
	{
		cout<<"-1\n";
		return;
	}
	dfs(1,0,0);
	int num=0;
	for(int i=1;i<=n;i++)
	{
		if(vis[i])num++;
	}
	if(num!=n/3-1)
	{
		cout<<"-1\n";
		return;
	}
	cout<<num<<"\n";
	for(int i=1;i<=n;i++)
	{
		if(vis[i])cout<<i<<" ";
	}
	cout<<"\n";
}

标签:题意,int,874,cin,Codeforces,Solution,solve,Div,void
From: https://www.cnblogs.com/HikariFears/p/17418256.html

相关文章

  • Codeforces Round 874 (Div. 3)
    A.MusicalPuzzle题意:用最少的长度为2的字符串按一定规则拼出s。规则是:前一个字符串的尾与后一个字符串的首相同。分析:统计s中长度为2的不同字符串数量。代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1e5;intmain(){......
  • CodeForces1061C Multiplicity
    题面翻译从序列\(\{a_1,\a_2,\..\,\a_n\}\)中选出非空子序列\(\{b_1,\b_2,\..\,\b_k\}\),一个子序列合法需要满足\(\forall\i\in[1,\k],\i\|\b_i\)。求有多少互不相等的合法子序列,答案对\(10^9+7\)取模。序列\(\{1,\1\}\)有\(2\)种选法得到子序列\(......
  • Codeforces 874 div3 (A-G)
    Codeforces874div3A题意计算每两个相邻字符的不同种类B题意重排一个数组b,使得\(|a_i-b_i|\leqk\)思路根据相对大小去一一对应,这样每个位置的绝对值最小,数据保证有解代码voidsolve(){ cin>>n>>k; for(inti=1;i<=n;i++)cin>>a[i].first,a[i].second=i; for(in......
  • 【vue】div标签和template标签使用区别
       ......
  • 【做题记录】CodeForces343D Water Tree
    题面翻译给出一棵以\(1\)为根节点的\(n\)个节点的有根树。每个点有一个权值,初始为\(0\)。\(m\)次操作。操作有\(3\)种:将点\(u\)和其子树上的所有节点的权值改为\(1\)。将点\(u\)到\(1\)的路径上的所有节点的权值改为\(0\)。询问点\(u\)的权值。\(1\le......
  • Codeforces 1832F - Zombies(wqs 二分)
    等价于最大化\(n\)对区间的交集之和。而对于每个\([l_i,r_i)\)我们肯定会选择与其交集最大的\([p,p+m)\)与之匹配,所以我们只用对\(k\)个区间进行决策即可。首先先发现一个东西:存在一种最优解,使得对于每个选择的区间\([p,p+m)\),要么有\(p=l_i\),要么有\(p+m=r_i\),也就是......
  • Codeforces Round 873 (Div. 2)
    Preface补题,这场本来周日晚上打算现场打的但一来第二天要上课怕熬太晚影响早上的微积分和电分,二来那天晚上开了DP专题然后就在手速抢一血过程中被两道DFS搞红温了,本来打CF的计划也咕咕咕了今天差不多想起来好久没做CF了赶紧补一场看了下自己补题的时候2h也才堪堪做完D1,虽然后......
  • Codeforces Round 703 (Div. 2) A-D
    CodeforcesRound703(Div.2) A.ShiftingStacksinta[N];voidsolve(){intn=read(),ans=1;for(inti=1;i<=n;i++)a[i]=read();intrest=0,last=-1;for(inti=1;i<=n;i++){a[i]+=rest;rest=a[i]-last-1;last++......
  • Codeforces Round 868 (Div. 2) A-D
    CodeforcesRound868(Div.2) A.A-characteristicintfac[N];map<int,int>mp;voidinit(){fac[1]=0;mp[0]=1;for(inti=2;i<N;i++){fac[i]=fac[i-1]+(i-1);mp[fac[i]]=i;}}voidsolve(){intn=read(),k=rea......
  • Codeforces Round 873 (Div. 2)
    CodeforcesRound873(Div.2)链接CodeforcesRound873(Div.2)A题打印2-n并且计算总和,然后找到严格大于sum的n的倍数记为x,然后用这个x减去sum得到a.然后先打印a然后再打印2-n#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include......