当前位置: 首页 > article >正文

D - Connect the Dots Codeforces Round 976 (Div. 2)

原题

 D - Connect the Dots

 

思路

直接去做的话会超时, 因此用差分去优化

代码

#include <bits/stdc++.h>
using namespace std;

int f[200020];
int z;
int b[11][200020];

// 并查集的 find 函数 
int find(int x)
{
	return f[x] != x ? f[x] = find(f[x]) : x;
}

// 检查是否一致, 一致则合并 
void check(int x, int y)
{
	x = find(x);
	y = find(y);
	if (x != y)
	{
//		每一次合并都会减少一个单独的区域 
		z--;
		f[x] = y;
	}
}

void solve()
{
	int n, m;
	cin >> n >> m;
	
	for (int i = 0; i < n + 5; i++)
	{
		f[i] = i;
		for (int d = 0; d < 11; d++)
		{
			b[d][i] = 0;
		}
	}
	
//		z 是答案, 一开始 n 个点各自都是一个区域 
	z = n;
	
//		输入 a d k 
	for (int i = 0; i < m; i++)
	{
		int a, d, k;
		cin >> a >> d >> k;
//			差分数组 
		b[d][a]++;
		b[d][a + d * k]--;
	}
	
//		d 从 1 到 10, 表示所选区域长度从 1 到 10
	for (int d = 1; d <= 10; d ++ )
	{
//			i 从 1 到 d, 表示起点从 1 到 d 
		for (int i = 1; i <= d; i++)
		{
//				s 初始化为 0 
			int s = 0;
//				
			for (int j = i; j <= n; j += d)
			{
//					j 是否与 j + d 相连, 求一个差分数组的前缀和即可 
				s += b[d][j];
				
				if (s > 0)
				{
					check(j, j + d);
				}
			}
		}
	}
//		输出答案 
	cout << z << endl;
}


int main()
{
	int t;
	cin >> t;
	
	while (t -- )
	{
		solve(); 
	}
	return 0;
}

 


http://www.kler.cn/news/336676.html

相关文章:

  • 基于SSM的高校勤工助学管理系统的设计与实现(源码+定制+参考文档)
  • 电影选票选座系统|影院购票|电影院订票选座小程序|基于微信小程序的电影院购票系统设计与实现(源码+数据库+文档)
  • 并查集的模拟实现
  • xtu oj 神经网络
  • linux下cmake编译64位,32位,ARM,ARM64程序
  • 论文阅读笔记-LogME: Practical Assessment of Pre-trained Models for Transfer Learning
  • 微服务seata解析部署使用全流程
  • 国庆期间的问题,如何在老家访问杭州办公室的网络呢
  • Hotspot是什么?
  • Luminar财务造假风波:激光雷达龙头的困境与挑战
  • 在VMware WorkStation上安装飞牛OS(NAS系统)
  • 苍穹外卖学习笔记(十五)
  • rust log选型
  • layernorm笔记
  • 富格林:揭晓黑幕躲避交易暗箱
  • Python 语言学习——应用1.2 数字图像处理(第二节,变换)
  • 基于LORA的一主多从监测系统_框架搭建
  • ElasticSearch备考 -- Update by query Reindex
  • 富贵险中求,我推荐你读这4本书
  • HTB:Funnel[WriteUP]