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

2023河南萌新联赛第(四)场:河南大学 F - 小富的idea

2023河南萌新联赛第(四)场:河南大学 F - 小富的idea

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

要注意节约

卷王小富最近又在内卷,并且学了一门新的技能:书法,但是不幸的是在国庆节的书法大赛上,小富不小心打翻了墨水瓶,导致很多墨滴溅在了他的书法纸上,看着墨水不断扩散,浸透了他的书法纸,小富突然萌生了一个想法:我能不能知道某时刻纸上一共有多少墨块?

我们假设墨滴是同时溅在纸上的,并且它们起始大小都为 0 0 0,由于墨滴大小不同,因此它们的扩散速度也不同,姑且假设墨滴都是按圆形扩散,如果两个或以上墨滴在扩散过程中相遇,那么就称它们为一个墨块(单独一个墨滴也是墨块),并且假设墨滴相遇不影响它的扩散,对于任意时刻 t t t,小富想知道纸上有多少墨块

由于小富是 c c p c ccpc ccpc 金牌,这个问题对他来说简直是小菜一碟,并且小富还要继续他的书法大赛,于是他决定把这个问题交给你来解决,希望你不要辜负他的期望哦

输入描述:

第一行一个整数 n n n,表示一共 n n n 个墨滴 ( 1 ≤ n ≤ 1 0 3 ) (1\le n \le 10^3) (1n103)
接下来 n n n 行,每行三个整数 x , y , v x,y,v x,y,v,分别表示墨滴的位置 ( x , y ) (x,y) (x,y),以及墨滴扩散的速度 v ( 0 ≤ x , y , v ≤ 1 0 3 ) v(0\le x, y, v\le10^3) v(0x,y,v103)
接下来一行一个整数 q q q,表示 q q q 次查询 ( 0 ≤ q , t ≤ 1 0 3 ) (0\le q,t \le 10^3) (0q,t103)
之后是 q q q 行,每行一个整数 t t t ,表示查询 t t t 时刻纸上一共多少个墨块

输出描述:

q q q 行,每行一个整数,表示 ttt 时刻纸上一共多少个墨块

输入

3
0 2 1
0 0 1
7 7 2
3
0
1
5

输出

3
2
1

说明

0时刻墨滴面积均为0,故答案为3
1时刻墨滴12相切,也记为相遇,故答案为2
5时刻三个墨滴都相遇,答案为1

对于任意一个墨滴,计算出它与其他所有墨滴的融合时间,并按时间从小到大排序,用并查集存储所有墨滴,然后从小到大枚举所有的融合时间,如果某个时间点发生两个墨滴融合,那么当前时间之后纸上墨滴数就减一,当然,如果融合的墨滴本身就在一个墨块里,总墨滴数不变标记出所有的墨滴减少的时间点,最后对于每次查询,输出当前墨滴数量即可

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;class edg implements Comparable<edg> {double d;int x, y;public edg(double d, int x, int y) {this.d = d;this.x = x;this.y = y;}@Overridepublic int compareTo(edg o) {return Double.compare(this.d, o.d);}
}public class Main {static int[] p = new int[1001];public static int find(int x) {if (x != p[x]) p[x] = find(p[x]);return p[x];}public static void main(String[] args) throws IOException {BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));int n = Integer.parseInt(bf.readLine());int[][] a = new int[n][3];for (int i = 0; i < n; i++) {String[] str = bf.readLine().split(" ");a[i][0] = Integer.parseInt(str[0]);a[i][1] = Integer.parseInt(str[1]);a[i][2] = Integer.parseInt(str[2]);p[i] = i;}ArrayList<edg> edgs = new ArrayList<>();for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {if (a[i][2] == 0 && a[j][2] == 0) continue;double D = Math.sqrt((a[i][0] - a[j][0]) * (a[i][0] - a[j][0]) + (a[i][1] - a[j][1]) * (a[i][1] - a[j][1]));double V = a[i][2] + a[j][2];edgs.add(new edg(D / V, i, j));}}Collections.sort(edgs);int[] res = new int[1001];int cnt = n;for (int i = 0, j = 0; i <= 1000; i++) {while (j < edgs.size() && edgs.get(j).d <= i) {int u = find(edgs.get(j).x), v = find(edgs.get(j).y);j++;if (u == v) continue;p[u] = v;cnt--;}res[i] = cnt;}int q = Integer.parseInt(bf.readLine());while (q-- > 0) {int t = Integer.parseInt(bf.readLine());bw.write(res[t] + "\n");}bw.close();}
}
http://www.lryc.cn/news/115941.html

相关文章:

  • 总结线程池
  • 基础的 lftp 使用方法
  • python之prettytable库的使用
  • google PGS 下一代id
  • 【elasticsearch】关于elasticsearch的max_result_window限制问题的解决方式思考
  • 音频光耦合器
  • 【C++精华铺】3.C++入门 引用(const)、内联函数
  • 生态系统服务(InVEST模型)供给与需求、价值核算技术及人类活动、重大工程项目、自然保护区、碳中和等领域中实际案例分析
  • TiDB Serverless 正式商用,全托管的云服务带来数据管理和应用程序开发的全新体验
  • PXE-kickstart无人值守安装操作系统
  • 使用Flask.Request的方法和属性,获取get和post请求参数(二)
  • 解决 idea maven依赖引入失效,无法正常导入依赖问题
  • Python之集合(set)基础知识点
  • flutter 没有open android module in Android studio 插件代码爆红
  • 计算机网络实验2:网络嗅探
  • 智慧防灾:数字孪生技术的应用
  • Google 扫码器(仅限 Android)
  • pandoc word转markdown之后正则修改
  • 使用Python和wxPython将图片转换为草图
  • 深入浅出对话系统——闲聊对话系统进阶
  • List与Set的区别
  • MyBatis 实战指南:探索灵活持久化的艺术
  • 高中教师能去美国做访问学者吗?
  • 93 | Python 设计模式 —— 建造者模式
  • nacos升级开启鉴权后,微服务无法连接的解决方案
  • elementui弹窗页按钮重复提交问题解决
  • HBase-读流程
  • Matlab绘图 图例legend 太长,怎么减小指示线的长度
  • 力扣17(电话号码中的字符组合)
  • vue+element 下载压缩包和导出