classFoodRatings:def__init__(self,foods:List[str],cuisines:List[str],ratings:List[int]):self.d=defaultdict(SortedList)self.g={}forfood,cuisine,ratinginzip(foods,cuisines,ratings):self.d[cuisine].add((-rating,food))self.g[food]=(rating,cuisine)defchangeRating(self,food:str,newRating:int)->None:oldRating,cuisine=self.g[food]self.g[food]=(newRating,cuisine)self.d[cuisine].remove((-oldRating,food))self.d[cuisine].add((-newRating,food))defhighestRated(self,cuisine:str)->str:returnself.d[cuisine][0][1]# Your FoodRatings object will be instantiated and called as such:# obj = FoodRatings(foods, cuisines, ratings)# obj.changeRating(food,newRating)# param_2 = obj.highestRated(cuisine)
classFoodRatings{privateMap<String,TreeSet<Pair<Integer,String>>>d=newHashMap<>();privateMap<String,Pair<Integer,String>>g=newHashMap<>();privatefinalComparator<Pair<Integer,String>>cmp=(a,b)->{if(!a.getKey().equals(b.getKey())){returnb.getKey().compareTo(a.getKey());}returna.getValue().compareTo(b.getValue());};publicFoodRatings(String[]foods,String[]cuisines,int[]ratings){for(inti=0;i<foods.length;++i){Stringfood=foods[i],cuisine=cuisines[i];intrating=ratings[i];d.computeIfAbsent(cuisine,k->newTreeSet<>(cmp)).add(newPair<>(rating,food));g.put(food,newPair<>(rating,cuisine));}}publicvoidchangeRating(Stringfood,intnewRating){Pair<Integer,String>old=g.get(food);intoldRating=old.getKey();Stringcuisine=old.getValue();g.put(food,newPair<>(newRating,cuisine));d.get(cuisine).remove(newPair<>(oldRating,food));d.get(cuisine).add(newPair<>(newRating,food));}publicStringhighestRated(Stringcuisine){returnd.get(cuisine).first().getValue();}}/** * Your FoodRatings object will be instantiated and called as such: * FoodRatings obj = new FoodRatings(foods, cuisines, ratings); * obj.changeRating(food,newRating); * String param_2 = obj.highestRated(cuisine); */
classFoodRatings{public:FoodRatings(vector<string>&foods,vector<string>&cuisines,vector<int>&ratings){for(inti=0;i<foods.size();++i){stringfood=foods[i],cuisine=cuisines[i];intrating=ratings[i];d[cuisine].insert({-rating,food});g[food]={rating,cuisine};}}voidchangeRating(stringfood,intnewRating){auto[oldRating,cuisine]=g[food];g[food]={newRating,cuisine};d[cuisine].erase({-oldRating,food});d[cuisine].insert({-newRating,food});}stringhighestRated(stringcuisine){returnd[cuisine].begin()->second;}private:unordered_map<string,set<pair<int,string>>>d;unordered_map<string,pair<int,string>>g;};/** * Your FoodRatings object will be instantiated and called as such: * FoodRatings* obj = new FoodRatings(foods, cuisines, ratings); * obj->changeRating(food,newRating); * string param_2 = obj->highestRated(cuisine); */
import("github.com/emirpasic/gods/v2/trees/redblacktree")typepairstruct{ratingintfoodstring}typeFoodRatingsstruct{dmap[string]*redblacktree.Tree[pair,struct{}]gmap[string]pair}funcConstructor(foods[]string,cuisines[]string,ratings[]int)FoodRatings{d:=make(map[string]*redblacktree.Tree[pair,struct{}])g:=make(map[string]pair)fori,food:=rangefoods{rating,cuisine:=ratings[i],cuisines[i]g[food]=pair{rating,cuisine}ifd[cuisine]==nil{d[cuisine]=redblacktree.NewWith[pair,struct{}](func(a,bpair)int{returncmp.Or(b.rating-a.rating,strings.Compare(a.food,b.food))})}d[cuisine].Put(pair{rating,food},struct{}{})}returnFoodRatings{d,g}}func(this*FoodRatings)ChangeRating(foodstring,newRatingint){p:=this.g[food]t:=this.d[p.food]t.Remove(pair{p.rating,food})t.Put(pair{newRating,food},struct{}{})p.rating=newRatingthis.g[food]=p}func(this*FoodRatings)HighestRated(cuisinestring)string{returnthis.d[cuisine].Left().Key.food}/** * Your FoodRatings object will be instantiated and called as such: * obj := Constructor(foods, cuisines, ratings); * obj.ChangeRating(food,newRating); * param_2 := obj.HighestRated(cuisine); */