Gridland Metro

Sort by

recency

|

423 Discussions

|

  • + 0 comments

    C++ solution with long long instead of int

    #include <bits/stdc++.h>
    
    using namespace std;
    
    string ltrim(const string &);
    string rtrim(const string &);
    vector<string> split(const string &);
    
    /*
     * Complete the 'gridlandMetro' function below.
     *
     * The function is expected to return an INTEGER.
     * The function accepts following parameters:
     *  1. INTEGER n
     *  2. INTEGER m
     *  3. INTEGER k
     *  4. 2D_INTEGER_ARRAY track
     */
    vector<vector<long long>> merge(vector<vector<long long>> tracks) {
        sort(tracks.begin(), tracks.end(), [](vector<long long>& a, vector<long long>& b) {
            return a[0] < b[0];
        });
    
        if (tracks.empty()) {
            return {};
        }
    
        vector<vector<long long>> merged_tracks;
        merged_tracks.push_back(tracks[0]);
    
        for (int i = 1; i < tracks.size(); i++) {
            long long last_end = merged_tracks.back()[1];
            long long current_start = tracks[i][0];
            long long current_end = tracks[i][1];
    
            if (current_start <= last_end + 1) { 
                merged_tracks.back()[1] = max(last_end, current_end);
            } else {
                merged_tracks.push_back(tracks[i]);
            }
        }
        return merged_tracks;
    }
    
    long long gridlandMetro(long long n, long long m, int k, vector<vector<int>> track) {
    
        long long totalsquares = n * m; 
        
        unordered_map<int, vector<vector<long long>>> mp; 
    
        for (const auto& i : track) {
            mp[i[0]].push_back({(long long)i[1], (long long)i[2]}); 
        }
    
        for (const auto& pair : mp) {
            const int row_index = pair.first;
            const vector<vector<long long>>& tracks_in_row = pair.second;
            
            vector<vector<long long>> merged_segments = merge(tracks_in_row);
            
            long long covered_cells_in_row = 0;
            
            for (const auto& segment : merged_segments) {
                covered_cells_in_row += segment[1] - segment[0] + 1; 
            }
            
            totalsquares -= covered_cells_in_row;
        }
        
        return totalsquares;
    }
    
    int main()
    {
        ofstream fout(getenv("OUTPUT_PATH"));
    
        string first_multiple_input_temp;
        getline(cin, first_multiple_input_temp);
    
        vector<string> first_multiple_input = split(rtrim(first_multiple_input_temp));
    
        int n = stoi(first_multiple_input[0]);
    
        int m = stoi(first_multiple_input[1]);
    
        int k = stoi(first_multiple_input[2]);
    
        vector<vector<int>> track(k);
    
        for (int i = 0; i < k; i++) {
            track[i].resize(3);
    
            string track_row_temp_temp;
            getline(cin, track_row_temp_temp);
    
            vector<string> track_row_temp = split(rtrim(track_row_temp_temp));
    
            for (int j = 0; j < 3; j++) {
                int track_row_item = stoi(track_row_temp[j]);
    
                track[i][j] = track_row_item;
            }
        }
    
        long long result = gridlandMetro(n, m, k, track);
    
        fout << result << "\n";
    
        fout.close();
    
        return 0;
    }
    
    string ltrim(const string &str) {
        string s(str);
    
        s.erase(
            s.begin(),
            find_if(s.begin(), s.end(), not1(ptr_fun<int, int>(isspace)))
        );
    
        return s;
    }
    
    string rtrim(const string &str) {
        string s(str);
    
        s.erase(
            find_if(s.rbegin(), s.rend(), not1(ptr_fun<int, int>(isspace))).base(),
            s.end()
        );
    
        return s;
    }
    
    vector<string> split(const string &str) {
        vector<string> tokens;
    
        string::size_type start = 0;
        string::size_type end = 0;
    
        while ((end = str.find(" ", start)) != string::npos) {
            tokens.push_back(str.substr(start, end - start));
    
            start = end + 1;
        }
    
        tokens.push_back(str.substr(start));
    		
    
        return tokens;
    }
    
  • + 0 comments

    There's a mistake in the stub code given for C++14 - the function we need to write should return 'long long' type, not 'int'. Otherwise the results gets truncaded for the large input.

  • + 0 comments

    import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Scanner;

    public class Solution {

    private static Map<Integer, ArrayList<Track>> tracksPerRow = new HashMap<Integer, ArrayList<Track>>();
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int numberOfRows = scanner.nextInt();
        int numberOfColumns = scanner.nextInt();
        int numberOfTracks = scanner.nextInt();
    
        for (int i = 0; i < numberOfTracks; i++) {
            int row = scanner.nextInt();
            int startColumn = scanner.nextInt();
            int endColumn = scanner.nextInt();
            fillMap(row, startColumn, endColumn);
        }
        scanner.close();
    
        sortTracksInsideRows_decreasingOrderOfStartColumn();
        long totalCellsWithTracks__exludingOverlaps = getTotalCellsWithTracks_exludingOverlaps();
    
        long spotsForLampPosts = (long) numberOfRows * numberOfColumns - (long) totalCellsWithTracks__exludingOverlaps;
        System.out.println(spotsForLampPosts);
    }
    
    private static void fillMap(int row, int start, int end) {
        Track track = new Track(start, end);
    
        if (!tracksPerRow.containsKey(row)) {
            ArrayList<Track> tracks = new ArrayList<Track>();
            tracks.add(track);
            tracksPerRow.put(row, tracks);
        } else {
            tracksPerRow.get(row).add(track);
        }
    }
    
    private static void sortTracksInsideRows_decreasingOrderOfStartColumn() {
        for (int row : tracksPerRow.keySet()) {
            Collections.sort(tracksPerRow.get(row));
        }
    }
    
    private static long getTotalCellsWithTracks_exludingOverlaps() {
    
        long totalCellsWithTracks__exludingOverlaps = 0;
    
        for (int row : tracksPerRow.keySet()) {
    
            int index = 0;
    
            ArrayList<Track> tracks = tracksPerRow.get(row);
    
            for (int i = 0; i < tracks.size(); i++) {
    
                if (index != 0 && tracks.get(index - 1).startColumn <= tracks.get(i).endColumn) {
                    while (index != 0 && tracks.get(index - 1).startColumn <= tracks.get(i).endColumn) {
    
                        int minStart = Math.min(tracks.get(index - 1).startColumn, tracks.get(i).startColumn);
                        int maxEnd = Math.max(tracks.get(index - 1).endColumn, tracks.get(i).endColumn);
    
                        tracks.get(index - 1).startColumn = minStart;
                        tracks.get(index - 1).endColumn = maxEnd;
                        index--;
                    }
                }
                else {
                    tracks.set(index, tracks.get(i));
                }
                index++;
            }
    
            for (int j = 0; j < index; j++) {
                totalCellsWithTracks__exludingOverlaps += (long) tracks.get(j).endColumn
                        - (long) tracks.get(j).startColumn + 1;
            }
        }
        return totalCellsWithTracks__exludingOverlaps;
    }
    
    private static class Track implements Comparable<Track> {
    
        int startColumn;
        int endColumn;
    
        public Track(int startColumn, int endColumn) {
            this.startColumn = startColumn;
            this.endColumn = endColumn;
        }
    
        @Override
        public int compareTo(Track arg0) {
            return arg0.startColumn - this.startColumn;
        }
    }
    

    }

  • + 0 comments

    This was the last task on this stupid site. Fortunately, there are many good sites with a similar focus.

  • + 0 comments

    What kind of idiotic condition is this? How can this be?

    k = 3
    r   c1  c2
    1   1   4
    2   2   4
    3   1   2
    4   2   3
    

    `Why k=3 if I see 4 tracks??? I have already tried several solutions, but none of them work.