| Task: | Sadonkorjuu |
| Sender: | Luc |
| Submission time: | 2022-11-12 21:50:52 +0200 |
| Language: | C++ (C++11) |
| Status: | READY |
| Result: | 0 |
| group | verdict | score |
|---|---|---|
| #1 | WRONG ANSWER | 0 |
| #2 | WRONG ANSWER | 0 |
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | ACCEPTED | 0.00 s | 1, 2 | details |
| #2 | ACCEPTED | 0.00 s | 1, 2 | details |
| #3 | ACCEPTED | 0.00 s | 1, 2 | details |
| #4 | ACCEPTED | 0.00 s | 1, 2 | details |
| #5 | ACCEPTED | 0.00 s | 1, 2 | details |
| #6 | WRONG ANSWER | 0.00 s | 1, 2 | details |
| #7 | WRONG ANSWER | 0.15 s | 2 | details |
| #8 | ACCEPTED | 0.00 s | 1, 2 | details |
| #9 | WRONG ANSWER | 0.15 s | 2 | details |
| #10 | ACCEPTED | 0.00 s | 1, 2 | details |
| #11 | ACCEPTED | 0.15 s | 2 | details |
| #12 | ACCEPTED | 0.13 s | 2 | details |
| #13 | ACCEPTED | 0.11 s | 2 | details |
| #14 | ACCEPTED | 0.11 s | 2 | details |
| #15 | ACCEPTED | 0.00 s | 1, 2 | details |
| #16 | ACCEPTED | 0.00 s | 1, 2 | details |
| #17 | ACCEPTED | 0.00 s | 1, 2 | details |
| #18 | WRONG ANSWER | 0.00 s | 1, 2 | details |
| #19 | ACCEPTED | 0.00 s | 1, 2 | details |
| #20 | ACCEPTED | 0.00 s | 1, 2 | details |
| #21 | WRONG ANSWER | 0.10 s | 2 | details |
| #22 | ACCEPTED | 0.11 s | 2 | details |
| #23 | ACCEPTED | 0.11 s | 2 | details |
| #24 | ACCEPTED | 0.00 s | 1, 2 | details |
| #25 | ACCEPTED | 0.11 s | 2 | details |
| #26 | ACCEPTED | 0.00 s | 1, 2 | details |
| #27 | ACCEPTED | 0.11 s | 2 | details |
| #28 | ACCEPTED | 0.01 s | 1, 2 | details |
| #29 | ACCEPTED | 0.10 s | 2 | details |
| #30 | ACCEPTED | 0.00 s | 1, 2 | details |
| #31 | ACCEPTED | 0.10 s | 2 | details |
Compiler report
input/code.cpp: In function 'int main()':
input/code.cpp:50:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
50 | scanf("%d", &n);
| ~~~~~^~~~~~~~~~
input/code.cpp:59:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
59 | scanf("%d", &x);
| ~~~~~^~~~~~~~~~
input/code.cpp:69:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
69 | scanf("%d %d %d", &x, &y, &z);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// A is a line of cities waiting to be processed
stack<pair<int, int>> a;
// (prosses city) | arguments 1-3: shared arrays from the main function | argument 4: city to be processed | argument 5: previously processed city | argument 6: shortest known distance to a port
ll processC(vector<ll> * sp, vector<bool> * field, vector<vector<pair<int, int>>> * conn, vector<bool> * pross, int c, int pc, ll cp){
// In this function all arrays will have an extra [0] after the name (array[r] -> array[0][r]), this is because they are pointers
if(!(field[0][c])){ // if the city has a port
if(!pross[0][c]){ // if the city has not yet been processed
// Loop that calls this function recursively to process each city connected to this city
for(vector<pair<int,int>>::iterator it = conn[0][c].begin(); it!= conn[0][c].end(); it++){
if(it->first==pc) continue; // Don't process the city which was previously processed
if(!field[0][it->first]) a.push({it->first,c}); // Two ports in a row, so we move that city to the processing line in order to not make this function to recursive
else processC(sp,field,conn,pross,it->first, c, 0+(ll)it->second);
}
pross[0][c]=1; // the city has now been processed
}
// The city has a port so the shortest distance from the city to a port is 0
return 0ll;
}
int t; // (temporary)
bool b = 0; //(boolean) to check if the value of cp ((distance to) closest port) changes during the loop
if( (!pross[0][c]) || sp[0][c]>cp){ // if the city has already been processed and cp is not smaller than the stored shortest distance to a port, then we don't need to reprocess the port
for(vector<pair<int,int>>::iterator it = conn[0][c].begin(); it!= conn[0][c].end(); it++){// and can simply return the value of cp
if(it->first==pc) continue; // Don't process the city which was previously processed
t=processC(sp,field,conn,pross,it->first, c, cp+(ll)it->second);
if(t+(ll)it->second<cp){ // if the sum of the value returned by the processed city and the distance to said city is smaller than cp, cp should be changed to the sum
cp=t+(ll)it->second;
b = 1; // value of cp has changed during the loop
}
}
// If the value of cp changed during the processing of the city we will need to reprocess it so that all cities connected to it will be processed with the true cp value
if(b) processC(sp,field,conn,pross,c, pc, cp);
pross[0][c]=1; // the city has now been processed
sp[0][c]=cp; // store the value of cp to the array of shortest distances
}
return cp;
}
int main(){
int n, i = 0, x, y, z;
scanf("%d", &n);
vector<ll> sp(n+1, 2999999999ll); // (shortest path) Array to store distance to closest port (default value 2999999999, because the distance to a port can never be 2999999999,
// so if the processing function will for each city with a field eventually change this value to the correct distance)
vector<bool> field(n+1, 0); // Boolean array to store which cities contain fields (0 = false && 1 = true)
// Checking if each city has a port or a field:
while(i++<n){
scanf("%d", &x);
field[i]=(bool)x;
}
vector<vector<pair<int, int>>> conn(n+1); // (connections) Array to store roads going out from each city like: conn[city 1] = {city 2, distance} & {city 3, distance} etc.
vector<bool> pross(n+1, 0); // (prossesed) Array to store which cities have been processed
// Storing the roads connecting the cities:
i=1;
while(i++<n){
scanf("%d %d %d", &x, &y, &z);
conn[x].push_back({y,z});
conn[y].push_back({x,z});
}
// A is a line of cities waiting to be processed, format: {cityX, cityY}, where cityX is the city to be processed and
// cityY is the "previous" processed city (aka the city which the function will belive was previous to be processed)
a.push({1, 0}); // Putting the city 1 into the line of cities being processed (previously processed city: 0, aka a non existent city since city 1 is the first one to be processed)
pair<int, int> t; // (temporary) A temporary variable for storing the data of the first element in line
// Calling the processC() function on the city in at the front of the line, untill the line is empty
while(!a.empty()){
t=a.top();
a.pop();
processC(&sp,&field,&conn,&pross,t.first,t.second, 2999999999ll); // For more info on what this means check the declatation of processC() above. ^
}
i=0;
ll r = 0; //(restult) the variable where the sum of the shortest distances from each port to their closest city will be stored
// counting the sum:
while(i++<n) if(field[i])r+=sp[i]; // only add the value of a city, if that city is has a field
printf("%lld", r);
}Test details
Test 1
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1 0 |
| correct output |
|---|
| 0 |
| user output |
|---|
| 0 |
Test 2
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 5 0 0 0 0 0 1 2 1 2 3 2 3 4 3 ... |
| correct output |
|---|
| 0 |
| user output |
|---|
| 0 |
Test 3
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 4 1 0 1 1 1 2 10 2 3 20 2 4 30 |
| correct output |
|---|
| 60 |
| user output |
|---|
| 60 |
Test 4
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 5 0 1 1 1 0 1 2 10 2 3 20 3 4 30 ... |
| correct output |
|---|
| 80 |
| user output |
|---|
| 80 |
Test 5
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 5 0 1 0 1 1 1 2 1 2 3 5 3 4 3 ... |
| correct output |
|---|
| 6 |
| user output |
|---|
| 6 |
Test 6
Group: 1, 2
Verdict: WRONG ANSWER
| input |
|---|
| 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 5506363 |
| user output |
|---|
| -1293664660561 |
Test 7
Group: 2
Verdict: WRONG ANSWER
| input |
|---|
| 200000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 1795118520 |
| user output |
|---|
| -258988865776933 |
Test 8
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1000 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1 ... |
| correct output |
|---|
| 293576 |
| user output |
|---|
| 293576 |
Test 9
Group: 2
Verdict: WRONG ANSWER
| input |
|---|
| 200000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 816932444 |
| user output |
|---|
| -255356225370784 |
Test 10
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... |
| correct output |
|---|
| 3089 |
| user output |
|---|
| 3089 |
Test 11
Group: 2
Verdict: ACCEPTED
| input |
|---|
| 200000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... |
| correct output |
|---|
| 40839 |
| user output |
|---|
| 40839 |
Test 12
Group: 2
Verdict: ACCEPTED
| input |
|---|
| 200000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 5683983203973 |
| user output |
|---|
| 5683983203973 |
Test 13
Group: 2
Verdict: ACCEPTED
| input |
|---|
| 200000 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 ... |
| correct output |
|---|
| 58572993 |
| user output |
|---|
| 58572993 |
Test 14
Group: 2
Verdict: ACCEPTED
| input |
|---|
| 200000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... |
| correct output |
|---|
| 32755 |
| user output |
|---|
| 32755 |
Test 15
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 126238345 |
| user output |
|---|
| 126238345 |
Test 16
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1000 0 0 0 1 0 1 1 1 0 0 1 0 1 1 0 ... |
| correct output |
|---|
| 278678 |
| user output |
|---|
| 278678 |
Test 17
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1000 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 ... |
| correct output |
|---|
| 34929 |
| user output |
|---|
| 34929 |
Test 18
Group: 1, 2
Verdict: WRONG ANSWER
| input |
|---|
| 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 1543963 |
| user output |
|---|
| -778267890417 |
Test 19
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... |
| correct output |
|---|
| 39606 |
| user output |
|---|
| 39606 |
Test 20
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1000 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 ... |
| correct output |
|---|
| 321598 |
| user output |
|---|
| 321598 |
Test 21
Group: 2
Verdict: WRONG ANSWER
| input |
|---|
| 200000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 978670626 |
| user output |
|---|
| -246280547051967 |
Test 22
Group: 2
Verdict: ACCEPTED
| input |
|---|
| 200000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... |
| correct output |
|---|
| 375218 |
| user output |
|---|
| 375218 |
Test 23
Group: 2
Verdict: ACCEPTED
| input |
|---|
| 200000 1 1 1 1 0 0 0 0 0 1 0 1 0 1 1 ... |
| correct output |
|---|
| 60422556 |
| user output |
|---|
| 60422556 |
Test 24
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 291990 |
| user output |
|---|
| 291990 |
Test 25
Group: 2
Verdict: ACCEPTED
| input |
|---|
| 200000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 59607954 |
| user output |
|---|
| 59607954 |
Test 26
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 990 |
| user output |
|---|
| 990 |
Test 27
Group: 2
Verdict: ACCEPTED
| input |
|---|
| 200000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 199982 |
| user output |
|---|
| 199982 |
Test 28
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1000 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 7987 |
| user output |
|---|
| 7987 |
Test 29
Group: 2
Verdict: ACCEPTED
| input |
|---|
| 200000 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 3137875 |
| user output |
|---|
| 3137875 |
Test 30
Group: 1, 2
Verdict: ACCEPTED
| input |
|---|
| 1000 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 4657693 |
| user output |
|---|
| 4657693 |
Test 31
Group: 2
Verdict: ACCEPTED
| input |
|---|
| 200000 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 1652889357 |
| user output |
|---|
| 1652889357 |
