CSES - Datatähti 2023 alku - Results
Submission details
Task:Sadonkorjuu
Sender:Luc
Submission time:2022-11-12 21:50:52 +0200
Language:C++ (C++11)
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
Test results
testverdicttimegroup
#1ACCEPTED0.00 s1, 2details
#2ACCEPTED0.00 s1, 2details
#3ACCEPTED0.00 s1, 2details
#4ACCEPTED0.00 s1, 2details
#5ACCEPTED0.00 s1, 2details
#60.00 s1, 2details
#70.15 s2details
#8ACCEPTED0.00 s1, 2details
#90.15 s2details
#10ACCEPTED0.00 s1, 2details
#11ACCEPTED0.15 s2details
#12ACCEPTED0.13 s2details
#13ACCEPTED0.11 s2details
#14ACCEPTED0.11 s2details
#15ACCEPTED0.00 s1, 2details
#16ACCEPTED0.00 s1, 2details
#17ACCEPTED0.00 s1, 2details
#180.00 s1, 2details
#19ACCEPTED0.00 s1, 2details
#20ACCEPTED0.00 s1, 2details
#210.10 s2details
#22ACCEPTED0.11 s2details
#23ACCEPTED0.11 s2details
#24ACCEPTED0.00 s1, 2details
#25ACCEPTED0.11 s2details
#26ACCEPTED0.00 s1, 2details
#27ACCEPTED0.11 s2details
#28ACCEPTED0.01 s1, 2details
#29ACCEPTED0.10 s2details
#30ACCEPTED0.00 s1, 2details
#31ACCEPTED0.10 s2details

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:

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:

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:

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:

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:

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