新型冠状病毒(COVID19)传播
来源:其他 ★ 1000
本题活力0.21按难度、完成结果与训练证据估算
算法如山行则将至
题目描述
给定N名跑者的起始位置S_i和速度V_i,其中一名在t=0时刻感染病毒,病毒在同一时刻同一位置的跑者间传播。求最终感染人数。
思考与重做
王梓豪的同题记录 · 1 条
- 王梓豪 · 2026-07-24本次记录最后更新 2026.7.24
完成结果:未记录
这题可以说十分的困难,gpt告诉我没有办法避开n2的复杂度,但是我相信人定胜天,最终还是没有做到
代码
#include <iostream>
#include <vector>
#include <iomanip>
#include <cmath>
#include <unordered_set>
#include <map>
#include <algorithm>
#include<unordered_map>
#include <cstdio>
#include <string>
#include <set>
#include <queue>
using namespace std;
bool canMeet(long long s1, long long v1, long long s2, long long v2) {
if (v1 == v2) {
return s1 == s2;
}
long long ds = s2 - s1;
long long dv = v1 - v2;
if (ds == 0) return true;
return (ds > 0 && dv > 0) || (ds < 0 && dv < 0);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, K;
cin >> N >> K;
--K;
vector<long long> S(N), V(N);
for (int i = 0; i < N; ++i) cin >> S[i];
for (int i = 0; i < N; ++i) cin >> V[i];
vector<vector<int>> g(N);
for (int i = 0; i < N; ++i) {
for (int j = i + 1; j < N; ++j) {
if (canMeet(S[i], V[i], S[j], V[j])) {
g[i].push_back(j);
g[j].push_back(i);
}
}
}
vector<int> vis(N, 0);
queue<int> q;
q.push(K);
vis[K] = 1;
int ans = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
++ans;
for (int v : g[u]) {
if (!vis[v]) {
vis[v] = 1;
q.push(v);
}
}
}
cout << ans << '\n';
return 0;
}