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

Codeforces Round 875 (Div. 2) A-D

时间:2023-05-29 23:36:24浏览次数:43  
标签:遍历 题意 int 画出 875 Codeforces push Div 节点

A. Twin Permutations

题意:给出一个由[1,2,...,n]组成的数组a,构造另一个由[1,2,...,n]组成的数组b,使得a[1]+b[1]<=a[2]+b[2]<=...<=a[n]+b[n]

Solution

可以想到只要让他们全为n+1就行了,这样是一定有解的

void solve()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
		b[i]=n+1-a[i];
		
	}
	for(int i=1;i<=n;i++)
	{
		cout<<b[i]<<" ";
	}
	cout<<"\n";
}

B. Array merging

题意:给出两个数组a,b,将他们合并,并保持原数组顺序不变,问最长的元素相同的子串是多长

Solution

范围好像不大,直接开了两个数组都存了下来然后遍历一遍

void solve()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	for(int i=1;i<=n*2;i++)c[i]=d[i]=0;
	int cnt=0;
	int last=-1;
	for(int i=1;i<=n+1;i++)
	{
		if(i==n+1||a[i]!=last)
		{
			if(last!=-1)c[last]=max(c[last],cnt);
			cnt=1;
			last=a[i];
		}else
		{
			cnt++;
		}
	}
	cnt=0;
	last=-1;
	for(int i=1;i<=n+1;i++)
	{
		if(i==n+1||b[i]!=last)
		{
			if(last!=-1)d[last]=max(d[last],cnt);
			cnt=1;
			last=b[i];
		}else
		{
			cnt++;
		}
	}
	int ans=0;
	for(int i=1;i<=n*2;i++)
	{
		ans=max(ans,c[i]+d[i]);
	}
	cout<<ans<<"\n";
	
}

C. Copil Copac Draws Trees

题意:有一颗树,最开始已经把点1画出来了,然后按给定的n-1边的顺序遍历所有边并依次检查这些边,如果当前检查的边至少有一个点画出来了,那么就把这条边和这条边上的点画出来,问最少要按照给定的边顺序遍历多少次才能完整画出这棵树

Solution

可以发现啊,假设第i个点是在第j条边并且是第k次遍历的时候被第一次画出,那么在它相连的点要么是在第k次遍历被第一次画出,要么是在第k+1次遍历的时候被第一次画出,而且画的顺序肯定是从根节点往外画,因为最开始只有根节点画出来了,那其实我们可以写一个类似bfs的东西,并且以被画出的遍历层数升序在优先队列里排序,把相邻节点都压入即可

struct node
{
	int x,level,p; //x表示这是第x个节点,level表示它第一次被画出的边的位置,p表示它是第p次遍历被画出的
	bool operator < (const node &t)const&{
		return p<t.p;
	}
};
vector<pii>e[N];
int t[N];
int vis[N];
void solve()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		e[i].clear();
		vis[i]=0;
	}
	priority_queue<node>q;
	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});
	}
	t[1]=1;
	q.push({1,0,1});
	int ans=0;
	while(q.size())
	{
		node t=q.top();
		q.pop();
		vis[t.x]=1;
		ans=max(ans,t.p);
		for(auto it:e[t.x])
		{
			if(vis[it.first])continue;
			if(t.x==1)q.push({it.first,it.second,1}); //特判一下1
			else 
			{
				if(it.second>t.level)//如果相邻节点第一次被画出的边在当前节点第一次被画出的后面
				{
					q.push({it.first,it.second,t.p});
				}else
				{
					q.push({it.first,it.second,t.p+1});
				}
			}
		}
	}
	cout<<ans<<"\n";
}

D. The BOSS Can Count Pairs

题意:给出两个数组a,b,求(i,j)的对数,满足a[i]×a[j]=b[i]+b[j],i<j

Solution

没啥好思路,看知乎上面的思路,不贴代码了

写一下我的理解吧

a[i]×a[j]=b[i]+b[j],题目条件里面写的是所有数都<=n,所以a[i]×a[j]其实是小于等于2n,那么就有min(a[i],a[j])<=sqrt(2n),这样子我们可以遍历(1,sqrt(2n))的数a[i],我们由a[i]×a[j]=b[i]+b[j]可知:b[i]=a[j]×a[i]-b[j],将数组按a[i]的大小排序,然后枚举所有(a[j],b[j]),找到对应的(a[i],b[i])的对数即可

标签:遍历,题意,int,画出,875,Codeforces,push,Div,节点
From: https://www.cnblogs.com/HikariFears/p/17442004.html

相关文章

  • Codeforces Round 875 (Div
    CodeforcesRound875(Div.2)C-D题解CProblem-C-Codeforces我们发现题述所形成的父亲节点一定比子节点先画出,并且如果子节点顺序在父节点后面,则父,子节点为同一个周期加入。反之,则子节点的周期为父节点+1。所以做法考虑树上dp,维护第i个节点加入树的周期。转移方程如下:\[......
  • Codeforces Round 875 (Div. 2)
    Preface难得现场打一次,这天下午打了三个半小时的校内赛,然后八点打了两小时ARC,最后再接上两个半小时的CF真是爽歪歪不过有一说一其实很多时候都在坐牢,这场CF也差不多,一个小时写完ABCD然后开始坐牢,其实E基本想出来了但是没想到用随机赋值的方法来实现不过由于这场手很稳因此排名......
  • CF1292 div.1 做题记录
    ACF题面若某一列的第\(i\)行禁止移动,那么看另一列的第\(i-1,i,i+1\)行是否存在禁止移动的格子,若存在为No,否则为Yes,这个只需要在改变一个点状态时判断即可。点击查看代码#include<bits/stdc++.h>#defineullunsignedlonglong#definelllonglong#definepiipair......
  • cf-div.2-875d
    链接:https://codeforces.com/contest/1831/problem/D脑子确实不好使,没啥思路,看jls代码之后豁然开朗。思路:先枚举约数s,因为\(b_i+b_j\)不会超过4e5,所以第一层枚举所有约数为根号级别,第二层循环里枚举所有对数,统计\(v=a_i*s-b_i\)的所有个数,只有当\(a_i\)的值与s的值相等时,才能......
  • Codeforces Round 874 (Div. 3)
    A.MusicalPuzzle#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;strings;cin>>n>>s;set<string>cnt;for(inti=0;i+1<n;i++)cnt.insert(s.substr(i,2));......
  • Codeforces Round 875 (Div. 2) A-D
    CodeforcesRound875(Div.2)A.TwinPermutationsinta[N];voidsolve(){intn=read();for(inti=1;i<=n;i++)a[i]=read();for(inti=1;i<=n;i++)cout<<n+1-a[i]<<'';cout<<'\n';//puts(ans&g......
  • CodeForces 1830C Hyperregular Bracket Strings
    洛谷传送门CF传送门每一步思路都非常自然的题。考虑先从一些简单的case入手。1.\(k=0\)设\(g_i\)为长度为\(i\)的合法括号串数。显然\(\foralli\nmid2,g_i=0\)。对于偶数的\(i\),这是一个经典问题,\(g_i\)就是第\(\frac{i}{2}\)项卡特兰数,因此\(g_i=\bi......
  • Codeforces Round #875 (Div. 2)
    CodeforcesRound#875(Div.2)bilibili:CodeforcesRound#875(Div.2)实况|完成度[4.01/6]A#include<bits/stdc++.h>usingll=longlong;usinguint=unsigned;usingnamespacestd;intTestCase;signedmain(){ for(scanf("%d",&......
  • Codeforces Round 875 (Div. 2) A~D
    CodeforcesRound875(Div.2)A~DA.TwinPermutations构造\(a[i]+b[i]=n+1\)voidwork(){ intn; cin>>n; rep(i,1,n){ intx; cin>>x; cout<<n-x+1<<""; } cout<<endl;}B.Arraymerging......
  • HTML中让上下两个div之间保持一定距离或没有距离
    这篇文章主要为大家详细介绍了HTML让上下两个DIV之间保持一定距离或没有距离,可以用来参考一下。1、若想上下DIV块之间距离,只需设定:在CSS里设置DIV标签各属性参数为0div{margin:0;border:0;padding:0;}这里就设置了DIV标签CSS属性相当于初始化了DIV标签CSS属性,这里设置margin外......