Submission #238177

#TimeUsernameProblemLanguageResultExecution timeMemory
238177Ruxandra985Tropical Garden (IOI11_garden)C++14
100 / 100
2824 ms31904 KiB
#include <bits/stdc++.h> #include "garden.h" #include "gardenlib.h" #define DIMN 150010 using namespace std; int f[2][DIMN] , taken[2][DIMN] , poz[2][DIMN] , taken_2[2][DIMN]; int dist[2][DIMN] , far[2][DIMN] , sol[2010]; vector < pair <int,int> > tt[2][DIMN]; pair <int , int> urm[2][DIMN]; int prm[DIMN] , doi[DIMN]; vector <int> v[DIMN]; deque <pair <int,int> > dq; void calcul (int state , int curr , int n , int q , int g[]){ int si , ci , dis , i , new_state , vecin , len1; for (i = 1 ; i <= n ; i++){ dist[0][i] = dist[1][i] = taken[0][i] = taken[1][i] = 0; } si = state; ci = curr; dis = 0; while (!taken[state][curr]){ taken[state][curr] = ++dis; new_state = urm[state][curr].first; vecin = urm[state][curr].second; state = new_state; curr = vecin; } if (state == si && curr == ci){ /// exista ciclu care il contine pe 0 , p len1 = dis; /// in muchii for (i = 1 ; i <= n ; i++){ if (taken[0][i]){ dist[0][i] = (dis - taken[0][i] + 1) % dis; dq.push_back(make_pair(0 , i)); } if (taken[1][i]){ dist[1][i] = (dis - taken[1][i] + 1) % dis; dq.push_back(make_pair(1 , i)); } } while (!dq.empty()){ state = dq.front().first; curr = dq.front().second; dq.pop_front(); if (state == 0){ for (i = 0 ; i < q ; i++){ if (dist[state][curr] % len1 == g[i] % len1 && dist[state][curr] <= g[i]){ sol[i]++; //if (si == 1) // printf ("%d %d\n" , state , curr); } } } for (i = 0 ; i < tt[state][curr].size() ; i++){ new_state = tt[state][curr][i].first; vecin = tt[state][curr][i].second; if ( taken[new_state][vecin] == 0 ){ dist[new_state][vecin] = 1 + dist[state][curr]; dq.push_back(make_pair(new_state , vecin)); } } } } else { /// stare curr nu face parte din ciclu state = si; curr = ci; dq.push_back(make_pair(state , curr)); dist[state][curr] = 1; while (!dq.empty()){ state = dq.front().first; curr = dq.front().second; dq.pop_front(); if (state == 0){ for (i = 0 ; i < q ; i++){ if (dist[state][curr] - 1 == g[i]) sol[i]++; } } for (i = 0 ; i < tt[state][curr].size() ; i++){ new_state = tt[state][curr][i].first; vecin = tt[state][curr][i].second; dist[new_state][vecin] = 1 + dist[state][curr]; dq.push_back(make_pair(new_state , vecin)); } } } } void count_routes(int n, int m, int p, int r[][2], int q, int g[]){ int i , curr , state , vecin , new_state , pc; p++; for (i = 0 ; i < m ; i++){ r[i][0]++; r[i][1]++; } for (i = 1 ; i <= n ; i++){ prm[i] = doi[i] = -1; poz[0][i] = poz[1][i] = 0; } for (i = 0 ; i < m ; i++){ if (prm[r[i][0]] == -1) prm[r[i][0]] = r[i][1]; else if (doi[r[i][0]] == -1) doi[r[i][0]] = r[i][1]; if (prm[r[i][1]] == -1) prm[r[i][1]] = r[i][0]; else if (doi[r[i][1]] == -1) doi[r[i][1]] = r[i][0]; } /// daca in nod ajungi pe muchia prm[nod] , o iei pe doi[nod], daca ea exista /// state = 0, esti libera sa o iei pe prm for (i = 1 ; i <= n ; i++){ curr = i; state = 0; pc = 1; while (!poz[state][curr]){ poz[state][curr] = pc; pc++; if (state == 0 || doi[curr] == -1){ vecin = prm[curr]; if (prm[vecin] == curr && doi[vecin] != -1) new_state = 1; else new_state = 0; } else { vecin = doi[curr]; if (prm[vecin] == curr && doi[vecin] != -1) new_state = 1; else new_state = 0; } /// din state, curr ----> new_state , vecin urm[state][curr] = make_pair(new_state , vecin); tt[new_state][vecin].push_back(make_pair(state , curr)); //printf ("%d %d %d %d\n" , state , curr , new_state , vecin); state = new_state; curr = vecin; } } calcul (0 , p , n , q , g); calcul (1 , p , n , q , g); for (i = 0 ; i < q ; i++) answer(sol[i]); }

Compilation message (stderr)

garden.cpp: In function 'void calcul(int, int, int, int, int*)':
garden.cpp:72:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (i = 0 ; i < tt[state][curr].size() ; i++){
                          ~~^~~~~~~~~~~~~~~~~~~~~~~~
garden.cpp:111:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (i = 0 ; i < tt[state][curr].size() ; i++){
                          ~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...