import java.io.PrintWriter /** * https://www.hackerrank.com/contests/hourrank-26/challenges/cloudy-day * Created on 02 February 2018 * @author hendrawd */ fun main(args: Array) { HourRank26_CloudyDay() } @Suppress("ClassName", "unused") private class HourRank26_CloudyDay { private val fastOutput by lazy { PrintWriter(System.out) } init { val townNumber = nextInt() val townPopulations = nextIntMutableList() val townLocations = nextIntMutableList() var cloudNumber = nextInt() var darkTownToCloudCounter = hashMapOf() while (cloudNumber-- > 0) { val cloudLocation = nextInt() val cloudRange = nextInt() townLocations .filter { isTownInCloudRange(it, cloudLocation, cloudRange) } .forEach { if (darkTownToCloudCounter.containsKey(it)) { darkTownToCloudCounter.put(it, darkTownToCloudCounter[it]!! + 1) } else { darkTownToCloudCounter.put(it, 1) } } } val townsWith1Cloud = darkTownToCloudCounter.filterValues { it == 1 } var townWith1CloudMaxPopulation = 0 var sunnyTownsPopulation = 0 for (i in 0 until townNumber) { val townLocation = townLocations[i] val townPopulation = townPopulations[i] if (darkTownToCloudCounter.containsKey(townLocation)) { if (townsWith1Cloud.containsKey(townLocation)) { townWith1CloudMaxPopulation = if (townPopulation > townWith1CloudMaxPopulation) { townPopulation } else { townWith1CloudMaxPopulation } } } else { sunnyTownsPopulation += townPopulation } } sunnyTownsPopulation += townWith1CloudMaxPopulation println(sunnyTownsPopulation) fastOutput.close() } private fun isTownInCloudRange(townLocation: Int, cloudLocation: Int, cloudRange: Int): Boolean { if (townLocation >= cloudLocation - cloudRange && townLocation <= cloudLocation + cloudRange) { return true } return false } private fun print(o: Any) { fastOutput.print(o) } private fun println(o: Any) { fastOutput.println(o) } private fun nextCharArray(): CharArray { return readLine()!!.toCharArray() } private fun nextDouble(): Double { return readLine()!!.toDouble() } private fun nextFloat(): Float { return readLine()!!.toFloat() } private fun nextInt(): Int { return readLine()!!.toInt() } private fun nextIntMutableList(): MutableList { return readLine()!!.split(" ").map { it.toInt() }.toMutableList() } private fun nextString(): String { return readLine()!! } }