Codeforces Round 863 (Div. 3)

Problem - E - Codeforces

思路:

  1. 少了一个数4,变成9进制,按照9进制的思路,每次取余9去取即可,因为少的是4,所以取余得的数大于等于4则+1
#include 
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl< pii;
typedef pair pll;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
//double 型memset最大127,最小128
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const int N = 2e5 + 10;

void mysolve()
{
	vectora;
	int n;
	cin>>n;
	while (n)
		{
			int tmp=n%9;
			n/=9;
			if (tmp>=4)tmp++;
			a.push_back(tmp);
		}
	for (int i=(int)a.size()-1; i>=0; --i)
		{
			cout<> t;
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

Problem - F - Codeforces

思路:DFS+大模拟

  1. 我们首先观察出k型花则整个图必须有k*k个点,k*(k+1)条边,而且,只有k个点是入度4,其余都是入度2
  2. 在满足这些条件的前提下,整个图要连通
  3. 然后,如果我们把中心k边型拆了,是不是得到k个k边型,我们需要保证每个都是k个点,则符合答案。
  4. 确认连通性与一个环的点数用dfs遍历即可
#include 
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl< pii;
typedef pair pll;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
//double 型memset最大127,最小128
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const int N = 2e5 + 10;

vectoredge[N];//建边,first为连接的点v,second为边权,为1说明边还存在,为0说明被删了
vectorvis(N+1);
int dfs(int u)//dfs确认当前连通的图有多少个点连着
{
	vis[u]=1;
	int cnt=1;
	for (auto [v,w]:edge[u])if (!vis[v]&&w)cnt+=dfs(v);
	return cnt;
}

void mysolve()
{
	int n,m,x,y;
	cin>>n>>m;
	vectorin(n+1);
	vectorb(5,0);
	for (int i=1; i<=n; ++i)edge[i].clear();
	for (int i=1; i<=m; ++i)
		{
			cin>>x>>y,in[x]++,in[y]++,edge[x].push_back({y,1}),edge[y].push_back({x,1});
		}
	int k=sqrt(n);
	bool flag=0;
	if (k*k==n&&k*(k+1)==m)
		{
			for (int i=1; i<=n; ++i)
				{
					if (in[i]==2)b[0]++;
					else if (in[i]==4)b[1]++;
					else break;
				}
			if (b[0]+b[1]==n&&b[1]==k)
				{
					vis=vector(n+1);
					int cnt=dfs(1);
					if (cnt==n)
						{
							for (int i=1; i<=n; ++i)if (in[i]==4)//删除中心的k边型的边
									{
										for (int j=0; j<(int)edge[i].size(); ++j)
											{
												if (in[edge[i][j].first]>2)	edge[i][j].second=0;
											}
									}
							vis=vector(n+1);
							flag=1;
							for (int i=1; i<=n; ++i)if (!vis[i]&&dfs(i)!=k){//检验是否每个图像都为k边型
								flag=0;break;
							}
						
						}
				}
		}
	if (flag)cout<<"YES"<> t;
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

你可能感兴趣的:(CF杂栏,c++,算法,开发语言)