首页 > 其他分享 >AtCoder Beginner Contest 378 F题题解

AtCoder Beginner Contest 378 F题题解

时间:2024-11-03 10:17:13浏览次数:5  
标签:AtCoder 连成 210000 int 题解 度为 vis long 378

题目:F - Add One Edge 2

思路:

可以发现题目就是要我们找出有多少个点对满足连成后是一个简单环

环上的点度都为3

因为是一个简单图

所以不可以有重边和自环

那么就代表着这个环肯定是由两个度为2的点和大于1个度为3的点组成的

注意到两个点的最近公共祖先一定可以跟这两个点形成环

所以我们用一个度为3的点去找

只往度为3的结点走

找到的所有度为2的点都可以彼此连成环

就像这样

红点之间都可以彼此连成环

答案就是sum*(sum-1)/2

由于每个点最多只被遍历一次

所以时间复杂度是O(n)

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,sum,ans;
vector<int>a[210000];
bool vis[210000];
void dfs(int x,int fa)
{
	vis[x]=1;
	for(int i=0;i<a[x].size();++i)
	{
		if(a[x][i]==fa)
		{
			continue;
		}
		if(a[a[x][i]].size()==2)
		{
			sum++;
		}
		else if(a[a[x][i]].size()==3)
		{
			dfs(a[x][i],x);
		}
	}
}
signed main()
{
	scanf("%lld",&n);
	for(int i=1;i<n;++i)
	{
		int x,y;
		scanf("%lld%lld",&x,&y);
		a[x].push_back(y);
		a[y].push_back(x);
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i].size()==3&&!vis[i])
		{
			sum=0;
			dfs(i,0);
			ans=ans+sum*(sum-1)/2;
		}
	}
	printf("%lld",ans);
	return 0;
}

记住要开long long

标签:AtCoder,连成,210000,int,题解,度为,vis,long,378
From: https://blog.csdn.net/m0_60355267/article/details/143461356

相关文章

  • Codeforces Round 984 div3 个人题解(A~F)
    CodeforcesRound984div3个人题解(A~F)Dashboard-CodeforcesRound984(Div.3)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#include<cassert>#include<cmath>#in......
  • AtCoder Beginner Contest 378
    省流版A.判断奇偶性即可B.根据余数计算偏移天数即可C.用map记录每个数出现的位置即可D.枚举起点,枚举每步的方向,朴素搜索即可E.考虑前缀和的两数相减代替区间和的情况,减为负数则加回正数,用树状数组维护减为负数的情况数F.枚举点,作为连边的俩个点的lca,考虑维护路径点......
  • ABC378
    A-Pairing简单模拟。B-GarbageCollection找到一个大于等于\(d\)的最小值,满足模$q=r$。简单分讨。C-Repeating简单模拟。D-CountSimplePaths纯DFS。枚举每个起点,暴力搜索统计答案。E-ModSigmaProblemF-AddOneEdge2G-Everlas......
  • ABC378G 官方题解 ChatGPT 4.0 翻译
    题目描述给定整数\(A\)、\(B\)和\(M\)。有多少种排列\(P=(P_1,\dots,P_{AB-1})\)满足以下所有条件?请将结果对\(M\)取模。\(P\)的最长递增子序列的长度为\(A\)。\(P\)的最长递减子序列的长度为\(B\)。存在一个整数\(n\),将\(n+0.5\)添加到\(P\)的末尾不......
  • AtCoder Beginner Contest 378题解
    省流:dfs都会写错。正片:A:Pairing统计一下每个数字出现了多少次即可,每次减去2。#include<bits/stdc++.h>usingnamespacestd;inta,b,c,d,ans;map<int,int>mp;intmain(){ cin>>a>>b>>c>>d; mp[a]++,mp[b]++,mp[c]++,mp[d]++; while(mp[a]>=2)mp[a......
  • AtCoder Beginner Contest 378题解
    AtCoderBeginnerContest378题解总体情况十分钟翻盘局。A-Pairing题意有四个球,每次可以消掉两个颜色相同的球,问最多能效多少次?题解直接使用贪心即可代码//Problem:A-Pairing//Contest:AtCoder-AtCoderBeginnerContest378//URL:https://atcoder.j......
  • AtCoder Beginner Contest 378
    A-Pairing题意给\(4\)个数,每次选两个数字相同的丢掉。求最大操作数。思路模拟。代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){inta,b,c,......
  • 2024CCPC哈尔滨 L 题解
    思路首先可以发现这个期望其实是假的,我们只需要把所有方案的答案加起来,最后除以\((\frac{n(n-1)}{2})^2\)即可,现在考虑如何统计所有方案的答案。我们先考虑一条路径的方案数:假设存在一条从\(x\)到\(y\)的公共路径,其中\(x\)是\(y\)的祖先,那么小红和小蓝分别选择的路径,......
  • ABC378 比赛记录
    ABC378比赛记录这场打得太唐了。。。A模拟B模拟C\(map\)模拟D爆搜模拟E很典的题目,感觉我绝对见过原题。要求\((a-b)\modm\)可以转化为$(a\modm)-(b\modm)+[a<b]*m$然后前缀和加树状数组做完了。F做\(F\)的时候本来还有一个多小时,rk300+。结果做了......