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

这篇具有很好参考价值的文章主要介绍了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

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

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;
    }

    @Override
    public 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();
    }
}

到了这里,关于2023河南萌新联赛第(四)场:河南大学 F - 小富的idea的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包