問題の説明 トピックリンク
O2OはOnline To Offlineです。これは、オフラインのビジネスチャンスとインターネットを組み合わせて、インターネットをオフライントランザクションのフロントデスクにすることを指します。これらのビジネスチャンスは、主に自動車のアフターサービス、写真サービス、ケータリング、映画など、オンライン購入とオフラインサービスを特徴とするサービス指向の製品です。
したがって、この垂直産業の製品のモバイル推奨を行う場合、ユーザーと製品の位置情報は特に重要です。ただし、ユーザーと製品の位置情報が欠落している場合もあります。たとえば、ユーザーが位置情報を共有していない、販売者が位置情報を入力していないなど...
現在、Jasonは、モバイル端末でのユーザーの購入行動データと製品コレクションを提供し、欠落している位置情報を入力できるようにしています。問題を単純化するために、
1.サービス商品であるため、ユーザーがA市にいる場合、ユーザーはA市にある製品のみを購入します。
2.データにノイズはありません。つまり、テストデータは合法です。
入力
複数のデータセットが含まれています
各入力データの形式は次のとおりです。
1行目、3つの数字:N、M、Q、N個の製品、M個の購入行動データ、Q件の問い合わせ。
次のN行では、各行に2つの数字があります。itemId、cityIdは、都市cityIdにある、販売者によって入力されたサービスitemIdを表します。
次のM行では、userId、itemId、およびcityIdの各行に3つの数字があり、ユーザーuserIdがサービスitemIdを購入し、モバイル端末が都市cityIdを見つけたことを示しています。
次のQ行では、各行に2つの数値があります。0、itemIdまたは1、userIdは、サービスitemIdが配置されている都市、またはユーザーuserIdが配置されている都市を照会することを意味します。
注:0は、ロケーション情報が欠落していることを意味します。
出力
入力例
出力例
ヒント
1 <= N <= LIMIT
1 <= M <= LIMIT
1 <= Q <= N + M
1 <= itemId <= N
1 <= userId <= M
0 <= cityId <= N + M、0は位置情報がないことを意味します
データの60%の場合、LIMIT <= 10 ^ 2、データの100%の場合、LIMIT <= 10 ^ 5
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <stdio.h> #include < string .h> using namespace std; / * 最初に、単純なマッピングを使用すると、対応するユーザーとアイテムが1対1ではないため、それほど単純ではないことがわかりましたマッピングは、多対多
の考え方です:種類とチェックセット、関連する ユーザーとアイテムをセットにマップ * / const int LIMIT = 2e5 + 10 ; int set [LIMIT]; // は、ユーザーとアイテムのセットチェックを意味します繰り返すことができない2種類のカテゴリがあるため、n + iマッピングを使用してアイテムのユーザーiを表す int city [LIMIT]; // city [i]は、祖先ノードがiに対応する都市IDであることを意味します // Find ancestors and path compression int find(inta) { if(set [a] == a) return a; return set [a] = find(set [a]); } // Joint void united(int a、int b) { int fa = find(a ); int fb = find(b); // セットに ないif(fa!= fb) // 優先順位を付ける if (city [fa]) { set [fb] = fa; } else { set [fa] = fb; } } int main() { // タイプとチェックの組み合わせset int n、m、q、userId、cityId、itemId; while(〜scanf (" %d%d%d "、&n 、&m、&q)) { for(int i = 1 ; i <= n + m; i ++ ) { set [i] = i; // それぞれをヘッドノードとして初期化するn + iはユーザーの 都市[i]を意味する = 0 ; } for(int i = 1 ; i <= n; i ++ ) { scanf(" %d%d "、&itemId、&cityId); if (cityId) { int itemfa = find(itemId); city [itemfa] = cityId; } } while(m-- ) { scanf(" %d%d% d "、&userId、&itemId、&cityId); // 2つをusetId + nで組み合わせて、セットにマッピングします (userId + n、itemId); if (cityId) { int itemfa =find(itemId); city [itemfa] = cityId; } } while(q-- ) { int a、id; scanf(" %d%d "、&a、&id); if (a) { // 说明是ユーザー ID + = n; // + n映射 } cityId = city [find(id)]; printf(" %d \ n " 、cityId); } } }
参照リンク:https : //zhuanlan.zhihu.com/p/97813717