FZU2192 位置信息挖掘
Problem Description 题目链接
O2O即Online To Offline,是指将线下的商务机会与互联网结合,让互联网成为线下交易的前台。这些商务机会主要是偏服务类的商品,例如汽车售后服务、摄影服务、餐饮、电影等,其特色是线上购买、线下服务。
因此,对这类垂直行业的商品做移动推荐时,用户和商品的位置信息显得格外重要。但是,可能存在用户、商品的位置信息缺失的情况,例如:用户不共享位置信息、商家未填写位置信息……
现在,Jason给出用户在移动端的购买行为数据,以及商品集合,希望能补全一些缺失的位置信息。为了简化问题,假设:
1、由于是服务类的商品,如果用户位于城市A,那么该用户只会购买位于城市A的商品。
2、数据不存在噪声,即测试数据都是合法的。
Input
包含多组数据
每组输入数据格式如下:
第一行,三个数:N、M、Q,表示N个商品,M条购买行为数据,Q个询问。
接下来N行,每行两个数:itemId、cityId,表示商家填写的服务itemId,位于城市cityId。
接下来M行,每行三个数:userId、itemId、cityId,表示用户userId购买了服务itemId,移动端定位城市cityId。
接下来Q行,每行两个数:0、itemId或者1、userId,表示询问服务itemId所在的城市,或者用户userId所在的城市。
注意:0表示位置信息缺失。
Output
Sample Input
Sample Output
Hint
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; /* 一开始采用简单映射发现事情没那么简单,因为这个对应的user和item不是一对一映射而是多对多
思路:种类并查集,将具有关联user和item映射在一个集合中 */ const int LIMIT = 2e5 + 10; int set[LIMIT]; //表示user和item的并查集 因为有俩种类别不能重复于是用n+i映射表示user i表示item int city[LIMIT]; //city[i]表示祖先节点为i对应的城市id //寻找祖先 并路径压缩 int find(int a) { if (set[a] == a) return a; return set[a] = find(set[a]); } //联合 void united(int a, int b) { int fa = find(a); int fb = find(b); //不在一个集合 if (fa != fb) //优先联合city存在的 if (city[fa]) { set[fb] = fa; } else { set[fa] = fb; } } int main() { //种类并查集的联合 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表示user city[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); //俩个先联合下 usetId+n进行映射在一个集合中 united(userId + n, itemId); if (cityId) { int itemfa = find(itemId); city[itemfa] = cityId; } } while (q--) { int a, id; scanf("%d%d", &a, &id); if (a) { //说明是user id += n; //+n映射 } cityId = city[find(id)]; printf("%d\n", cityId); } } }
参考链接:https://zhuanlan.zhihu.com/p/97813717
原文地址:https://www.cnblogs.com/dlvguo/p/12743766.html
- Golang泛型编程初体验
- 工具| 手把手教你制作信息收集器之端口扫描
- 厚土Go学习笔记 | 14. switch 的条件写的有点灵活,不过风格还是go的一贯风格
- Nodejs学习笔记(十四)— Mongoose介绍和入门
- 厚土Go学习笔记 | 13. 用循环和函数 实现Sqrt(x)
- 代码审计| 这是一款适合练手的漏洞
- 工具| NSE漏洞审计和渗透脚本的demo
- Windows Server 2008 R2 配置Exchange 2010邮件服务器并使用EWS发送邮件
- 厚土Go学习笔记 | 12. if 语句
- 厚土Go学习笔记 | 11. for循环 go语言只有for循环
- 从编译原理看一个解释器的实现
- 厚土Go学习笔记 | 10. 常量 与 数值常量
- Unity应用架构设计(7)——IoC工厂理念先行
- 厚土Go学习笔记 | 09. 类型转换 与 类型推导
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- rsync性能终极优化【Optimize rsync performance】
- 你不知道的Golang盲点汇总【持续更新】
- TCP SYN flood洪水攻击原理和防御破解
- 你不知道的Golang map
- go 1.11 模块和版本管理
- Golang Testing单元测试指南
- 你不知道的Go unsafe.Pointer uintptr原理和玩法
- 深度剖析各种BloomFilter的原理、改进、应用场景
- 深入理解哈希表
- iota: Golang 中优雅的常量
- Go template高级用法、深入详解、手册、指南、剖析
- Docker开启Remote API 访问 2375端口
- Docker实用debug调试技巧锦集
- shell 命名管道,进程间通信, ncat作http server
- Linux atop监控