| Task: | Tietoverkko |
| Sender: | EeliH |
| Submission time: | 2021-10-07 23:05:03 +0300 |
| Language: | C++ (C++11) |
| Status: | READY |
| Result: | 25 |
| group | verdict | score |
|---|---|---|
| #1 | ACCEPTED | 10 |
| #2 | ACCEPTED | 15 |
| #3 | TIME LIMIT EXCEEDED | 0 |
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | ACCEPTED | 0.01 s | 1, 2, 3 | details |
| #2 | ACCEPTED | 0.07 s | 2, 3 | details |
| #3 | TIME LIMIT EXCEEDED | -- | 3 | details |
Code
#include <algorithm>
#include <iostream>
#include <stack>
#include <vector>
#pragma GCC optimize ("O3")
using namespace std;
vector<struct yhteys> yhteydet;
vector<vector<uint64_t>> naapurit;
int saaria = 1;
vector<uint64_t> saarimaarat;
vector<uint64_t> saaret;
struct yhteys {
uint64_t a;
uint64_t b;
uint64_t nopeus;
};
bool a_comp(struct yhteys a, struct yhteys b)
{
return a.nopeus < b.nopeus;
}
uint64_t maara(uint64_t tietokone, uint64_t pois, int saari)
{
uint64_t m = 1;
saaret[tietokone] = saari;
for(uint64_t naapuri: naapurit[tietokone]) {
//cout << tietokone << ": " << naapuri << endl;
//cout << "MÄÄRÄ " << tietokone << " " << pois << " " << naapuri << endl;
if(naapuri != pois && naapuri != 0xffffffffffffffff) {
//cout << "OIKEA NAAPURI" << endl;
m += maara(naapuri, tietokone, saari);
}
}
return m;
/*uint64_t m = 0;
stack<int> tietokoneet, poiss;
tietokoneet.push(tietokone);
poiss.push(pois);
while(!tietokoneet.empty()) {
tietokone = tietokoneet.top();
pois = poiss.top();
tietokoneet.pop();
poiss.pop();
m++;
for(uint64_t naapuri: naapurit[tietokone]) {
if(naapuri != pois && naapuri != 0xffffffffffffffff) {
tietokoneet.push(naapuri);
poiss.push(tietokone);
}
}
}
return m;*/
}
void paivita_saaret(struct yhteys yhteys)
{
uint64_t vanha = saarimaarat[saaret[yhteys.a]];
int uusisaari = saaria;
saaria++;
int a = maara(yhteys.a, yhteys.b, uusisaari);
saarimaarat[uusisaari] = a;
saarimaarat[saaret[yhteys.b]] = /*maara(yhteys.b, yhteys.a, saaret[yhteys.b])*/ vanha - a;
}
int main()
{
uint64_t n;
cin >> n;
for(uint64_t i = 0; i < n + 1; i++) {
vector<uint64_t> v;
naapurit.push_back(v);
saarimaarat.push_back(0);
}
saarimaarat[0] = n;
for(uint64_t i = 0; i < n - 1; i++) {
struct yhteys yhteys;
cin >> yhteys.a >> yhteys.b >> yhteys.nopeus;
yhteydet.push_back(yhteys);
naapurit[yhteys.a].push_back(yhteys.b);
naapurit[yhteys.b].push_back(yhteys.a);
saaret.push_back(0);
}
sort(yhteydet.begin(), yhteydet.end(), a_comp);
uint64_t summa = 0;
for(struct yhteys yhteys: yhteydet) {
naapurit[yhteys.b][distance(naapurit[yhteys.b].begin(), find(naapurit[yhteys.b].begin(), naapurit[yhteys.b].end(), yhteys.a))] = 0xffffffffffffffff;
naapurit[yhteys.a][distance(naapurit[yhteys.a].begin(), find(naapurit[yhteys.a].begin(), naapurit[yhteys.a].end(), yhteys.b))] = 0xffffffffffffffff;
paivita_saaret(yhteys);
uint64_t m1 = saarimaarat[saaret[yhteys.b]];
//remove(naapurit[yhteys.b].begin(), naapurit[yhteys.b].end(), yhteys.a);
//remove(naapurit[yhteys.a].begin(), naapurit[yhteys.a].end(), yhteys.b);
//cout << "A" << yhteys.nopeus << " " << yhteys.b << " " << yhteys.a << " " << r << endl;
uint64_t m2 = saarimaarat[saaret[yhteys.a]];
uint64_t r = m1 * m2 * yhteys.nopeus;
//cout << "A" << yhteys.nopeus << " " << yhteys.a << " " << yhteys.b << " " << r << endl;
summa += r;
}
cout << summa << endl;
}
Test details
Test 1
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| 100 1 2 74 1 3 100 2 4 50 3 5 40 ... |
| correct output |
|---|
| 88687 |
| user output |
|---|
| 88687 |
Test 2
Group: 2, 3
Verdict: ACCEPTED
| input |
|---|
| 5000 1 2 613084013 1 3 832364259 2 4 411999902 3 5 989696303 ... |
| correct output |
|---|
| 1103702320243776 |
| user output |
|---|
| 1103702320243776 |
Test 3
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input |
|---|
| 200000 1 2 613084013 1 3 832364259 2 4 411999902 3 5 989696303 ... |
| correct output |
|---|
| 1080549209850010931 |
| user output |
|---|
| (empty) |
