首页 > 其他分享 >CF506D Mr. Kitayuta's Colorful Graph

CF506D Mr. Kitayuta's Colorful Graph

时间:2023-10-07 19:45:44浏览次数:28  
标签:typedef int Graph pnt fa CF506D Kitayuta include getfa

好久没更新这个单题系列了,主要是最近没啥CF比赛空闲时间又少,今天忙里偷闲写了两个题

这个题就比较典了,两点是否连通一般都是想到并查集维护,现在的问题是要对每种颜色的边把贡献算清楚

很容易想到枚举所有颜色的边,每次求出所有连通分量后遍历一遍询问统计答案,这样正确性显然但复杂度是\(O(m\times (n+q))\)的

冷静思考一下会发现其实很多时候连通分量的大小和数量都很少,完全不需要我们暴力遍历所有询问,我们可以直接平方暴力枚举一个连通分量内的所有点对,然后把它对应的询问的答案更新即可

然后结合两种算法就很容易得到一个根号分治的做法,我们设阈值\(S=\sqrt m\)

对于某种颜色的边,如果其边数\(>S\)就直接跑前面的算法,否则记录下所有用到的点,遍历每个联通块即可

总复杂度\(O(m\sqrt m\times (\alpha(n)+\log n))\)

#include<cstdio>
#include<iostream>
#include<utility>
#include<vector>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<set>
#include<array>
#include<random>
#include<bitset>
#include<ctime>
#include<limits.h>
#include<assert.h>
#include<unordered_set>
#include<unordered_map>
#define RI register int
#define CI const int&
#define mp make_pair
#define fi first
#define se second
#define Tp template <typename T>
using namespace std;
typedef long long LL;
typedef long double LDB;
typedef unsigned long long u64;
typedef __int128 i128;
typedef pair <int,int> pi;
typedef vector <int> VI;
typedef array <int,3> tri;
const int N=100005;
int n,m,a,b,c,q,x[N],y[N],ans[N],fa[N];
vector <pi> col[N]; vector <int> num[N]; map <pi,vector <int>> qid;
inline int getfa(CI x)
{
	return fa[x]!=x?fa[x]=getfa(fa[x]):x;
}
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	RI i,j,k; for (scanf("%d%d",&n,&m),i=1;i<=m;++i)
	scanf("%d%d%d",&a,&b,&c),col[c].push_back(pi(a,b));
	for (i=1;i<=n;++i) fa[i]=i;
	for (scanf("%d",&q),i=1;i<=q;++i)
	{
		scanf("%d%d",&x[i],&y[i]);
		if (x[i]>y[i]) swap(x[i],y[i]); qid[pi(x[i],y[i])].push_back(i);
	}
	int S=(int)sqrt(m); for (i=1;i<=m;++i)
	{
		if (col[i].size()<=S)
		{
			vector <int> pnt; for (auto [a,b]:col[i])
			pnt.push_back(a),pnt.push_back(b),fa[getfa(a)]=getfa(b);
			sort(pnt.begin(),pnt.end()); pnt.erase(unique(pnt.begin(),pnt.end()),pnt.end());
			for (auto x:pnt) num[getfa(x)].push_back(x);
			for (auto x:pnt) if (getfa(x)==x)
			{
				for (j=0;j<num[x].size();++j) for (k=j+1;k<num[x].size();++k)
				{
					a=num[x][j]; b=num[x][k]; if (a>b) swap(a,b);
					if (qid.count(pi(a,b))) for (auto it:qid[pi(a,b)]) ++ans[it];
				}
			}
			for (auto x:pnt) num[x].clear(),fa[x]=x;
		} else
		{
			for (auto [a,b]:col[i]) fa[getfa(a)]=getfa(b);
			for (j=1;j<=q;++j) ans[j]+=getfa(x[j])==getfa(y[j]);
			for (j=1;j<=n;++j) fa[j]=j;
		}
	}
	for (i=1;i<=q;++i) printf("%d\n",ans[i]);
	return 0;
}

标签:typedef,int,Graph,pnt,fa,CF506D,Kitayuta,include,getfa
From: https://www.cnblogs.com/cjjsb/p/17747297.html

相关文章

  • 构造Vulkan图形管线:VkGraphicsPipeline
     创建Pipeline构造信息:它包括:基本构造信息VkStructureType构建Pipeline额外需要的结构:constvoid*pNext构建Pipeline时指定的Flags:VkPipelineCreateFlags多个ShaderStage信息:VkPipelineShaderStageCreateInfo*(数组)......
  • Graph-less Collaborative Filtering
    目录概符号说明SimRecPrediction-LevelDistillationEmbedding-levelDistillationAdaptiveContrastiveRegularization总的损失代码XiaL.,HuangC.,ShiJ.andXuY.Graph-lesscollaborativefiltering.WWW,2023.概从GNN的教师模型中蒸馏结构信息到一般的不带图结......
  • 论文阅读:iterator zero-shot llm prompting for knowledge graph construction
    Abstract知识图谱,一种相互连接和可解释的结构。生成需要更多的人力、领域知识、并需要适用于不同的应用领域。本论文提出借助LLM,通过0-shot和外部知识不可知的情况下生成知识图谱。主要贡献:迭代的prompting提取最终图的相关部分0-shot,不需要examples一个可扩展的解决方案,......
  • 解决警告UserWarning: Glyph 38388 (\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from
    这个警告是由于在绘图时使用了当前字体不支持的字符,通常出现在使用非英文字符(比如中文、日文等)时。为了解决这个问题,你可以尝试以下几种方法:方法一:选择支持中文的字体在绘图之前,指定一个支持中文的字体。例如,可以使用matplotlib.rcParams来指定字体,示例如下:importmatplotlib.pyplo......
  • G. Counting Graphs
    G.CountingGraphs题意:添加几条线段,使得图仍保持原先的最小生成树通过画图我们发现,要添加u->v的线段,线段必须大于u->v的路径内的最大值,不然会破坏原先的最小生成树。那么该怎么维护路径内的最大值呢?方法:1.我们对边的大小进行排序,这样当前边一定大于等于之前的边,只要对当前边......
  • 并行计算框架 Taskflow && CGraph
      taskflow/taskflow:AGeneral-purposeParallelandHeterogeneousTaskProgrammingSystem(github.com) ChunelFeng/CGraph:【AsimpleC++DAGframework】一个简单好用的、无三方依赖的、跨平台的、收录于awesome-cpp的、基于流图的并行计算框架。欢迎star&for......
  • prism软件-graphpad prism软件下载 安装包下载方式
    GraphPadPrism提供了丰富的工具,用于创建科学的图表,并生成相关统计数据等等。此外,最新版本的GraphPadPrism软件为GraphPadPrism9.3.0,功能强大,同时也很容易上手,能够满足绝大部分医学科研绘图的需求。软件地址:看置顶贴软件介绍GraphPadPrismMAC版是一款高效易用的科研绘图工具,它......
  • OWASP Top 10漏洞解析(2)- A2:Cryptographic Failures 加密机制失效
    作者:gentle_zhou原文链接:<https://bbs.huaweicloud.com/blogs/405125>Web应用程序安全一直是一个重要的话题,它不但关系到网络用户的隐私,财产,而且关系着用户对程序的新人。随着Web应用程序功能持续增加,复杂性不断提高,这些程序也面临着越来越多的安全威胁和挑战。为了帮助这些应用程......
  • [NIPS 2021]Do Transformers Really Perform Bad for Graph Representation
    [NIPS2021]DoTransformersReallyPerformBadforGraphRepresentation微软提出的graphtransformer,名叫GraphormerTransformer通常,transformerlayer有一个self-attentionmodule和一个position-wisefeed-forwardnetwork(FFN)组成。首先将特征映射成三组:\[Q=HW_Q,K=......
  • 3D力导向树插件 3d-force-graph
    3d-force-graph是什么?一个Web组件,使用强制导向的迭代布局来表示3维空间中的图形数据结构。使用ThreeJS /WebGL进行3D渲染,使用d3-force-3d或ngraph作为底层物理引擎。 3d-force-graph可以做些什么?参考以下效果:哔哩哔哩:https://www.bilibili.com/video/BV1WS4y1s7st......