原题链接:https://codeforces.com/problemset/problem/670/C

题目大意:

有 n 个人,每人会且仅会一种语言. (n ≤ 2e5)

语言有各自的编号(≤ 1e9)

这些人去看电影,一共有 m 种电影. (m ≤ 2e5)

每个电影的声音与字幕语言都不一样.

若有人的语言与声音语言一样,则称这个人很高兴♂.

若有人的语言与字幕语言一样,则称这个人比较高兴.

现让你选择一场电影,使得此电影中,很高兴的人最多,在此条件下,再使比较高兴的人最多.

分析:

因为要统计每种语言的人数,而语言编号 ≤ 1e9,存不下.

所以考虑离散化.

可得离散化之后,语言总数最多 n + 2m 种.

AC代码:

  1. #include<bits/stdc++.h>
  2. #define INF 0x3f3f3f3f
  3. using namespace std;
  4. const int maxn = 2e5 + 5;
  5. int n, m;
  6. int a[maxn], b[maxn], c[maxn];
  7. int sum[maxn * 3];
  8. int cnt, mm;
  9. int arr[maxn * 3], num[maxn * 3];
  10. void discrete() {//离散化
  11. sort(arr + 1, arr + cnt + 1);
  12. for (int i = 1; i <= cnt; i++) {
  13. if (i == 1 || arr[i] != arr[i - 1])
  14. num[++mm] = arr[i];
  15. }
  16. }
  17. int query(int x) {//二分查找x的位置
  18. return lower_bound(num + 1, num + mm + 1, x) - num;
  19. }
  20. int main() {
  21. scanf("%d", &n);
  22. for (int i = 1; i <= n; i++) {//将所有电影和人涉及的语言放进一个数组,排序并离散化
  23. scanf("%d", &a[i]);
  24. arr[++cnt] = a[i];
  25. }
  26. scanf("%d", &m);
  27. for (int i = 1; i <= m; i++) {
  28. scanf("%d", &b[i]);
  29. arr[++cnt] = b[i];
  30. }
  31. for (int i = 1; i <= m; i++) {
  32. scanf("%d", &c[i]);
  33. arr[++cnt] = c[i];
  34. }
  35. discrete();//离散化
  36. for (int i = 1; i <= n; i++) {
  37. int id = query(a[i]);//统计每种语言的人的数量
  38. ++sum[id];
  39. }
  40. int bmax = -1, cmax = -1, ans = 0;
  41. for (int i = 1; i <= m; i++) {//选择满足题目要求的电影
  42. int x = query(b[i]);
  43. int y = query(c[i]);
  44. if (sum[x] > bmax) {//优先考虑让很高兴的人最多
  45. bmax = sum[x], cmax = sum[y];
  46. ans = i;
  47. }
  48. else {
  49. if (sum[x] == bmax && sum[y] > cmax) {//如果答案不唯一、则在此前提下再让比较高兴的人最多
  50. bmax = sum[x], cmax = sum[y];
  51. ans = i;
  52. }
  53. }
  54. }
  55. printf("%d\n", ans);
  56. return 0;
  57. }

暴力解法:670ms

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef pair<int, int>PII;
  4. int n, m;
  5. int a[20000005];
  6. map<int, int>mp;
  7. int main() {
  8. //freopen("in.txt", "r", stdin);
  9. ios::sync_with_stdio(false), cin.tie(0);
  10. cin >> n;
  11. for (int i = 1, a; i <= n; ++i)
  12. cin >> a, mp[a]++;
  13. int k, max1 = -1, max2 = -1;
  14. cin >> m;
  15. for (int i = 1; i <= m; ++i) {
  16. cin >> a[i];
  17. max1 = max(max1, mp[a[i]]);
  18. }
  19. for (int i = 1,b; i <= m; ++i) {
  20. cin >> b;
  21. if (mp[a[i]] == max1 && mp[b] > max2)
  22. max2 = mp[b], k = i;
  23. }
  24. cout << k << endl;
  25. }

Codeforces 670C (离散化入门题)的更多相关文章

  1. POJ1151-扫面线+线段树+离散化//入门题

    比较水的入门题 记录矩形竖边的x坐标,离散化排序.以被标记的边建树. 扫描线段树,查询线段树内被标记的边.遇到矩形的右边就删除此边 每一段的面积是查询结果乘边的横坐标之差,求和就是答案 #includ ...

  2. hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  3. poj 2524:Ubiquitous Religions(并查集,入门题)

    Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23997   Accepted:  ...

  4. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  5. hdu 1754:I Hate It(线段树,入门题,RMQ问题)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  7. zstu.4194: 字符串匹配(kmp入门题&& 心得)

    4194: 字符串匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 206  Solved: 78 Description 给你两个字符串A,B,请 ...

  8. hrbustoj 1073:病毒(并查集,入门题)

    病毒Time Limit: 1000 MS Memory Limit: 65536 KTotal Submit: 719(185 users) Total Accepted: 247(163 user ...

  9. hdu 1465:不容易系列之一(递推入门题)

    不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  10. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

随机推荐

  1. java String字符串总结

    这里我们将总结字符串相关的知识,除了总结String的API用法,同时我们还会总结一些相关的知识点,包括字符串常量池.StringBuffer.StringBuilder,以及equals和==的用法 ...

  2. 记一次线上Oracle连接耗时过长的问题

    问题现象 1.远程Oracle数据库通过IP:PORT/SERVICE_NAME连接 2.应用服务通过Docker容器部署,访问Oracle联通性测试接口,需要50s左右才能返回连接成功: 3.写了个 ...

  3. [算法考研笔记]mm算法随笔[成绩划分][回溯0-1][得分][字段和][聪明小偷][股票买卖]

    mm算法随笔 学习笔记(回溯算法) 回溯 <---->递归1.递归的下面就是回溯的过程 回溯法是一个 纯暴力的 搜索.有的时候暴力求解都没有办法,用回溯可以解决. 回溯法解决的问题: 组合 ...

  4. 429 You are being rate limited

    记录贴 429 真的很让人伤心 清除浏览器数据 我用的 Edge : 设置 ⇒ 隐私.搜索和服务 ⇒ 清除浏览器数据 ⇒ 立即清除 然后就重新登陆可以了

  5. JUC——让步与优先级

    Thread.yield():方法作用是:暂停当前正在执行的线程对象(及放弃当前拥有的cup资源),并执行其他线程 yield():做的是让当前运行线程回到可运行的状态,以允许具有相同优先级的其他线程 ...

  6. 安装NETDATA集群监控面板

    安装NETDATA集群监控面板 介绍 官方链接 演示网页:https://my-netdata.io/ 官方首页:http://netdata.cloud/ 文档地址:http://docs.netd ...

  7. 探秘扫雷游戏的C语言实现

    1 引言 1.1 为什么写这篇文章? 项目仓库地址:基于 C 语言实现的扫雷游戏 我决定写这篇文章的初衷是想分享我在使用C语言开发扫雷游戏的经验和心得.通过这篇文章,我希望能够向读者展示我是如何利用C ...

  8. 聊聊流式数据湖Paimon(三)

    概述 如果表没有定义主键,则默认情况下它是仅追加 表类型(Append Only Table). 根据桶(Bucket)的定义,我们有两种不同的仅追加模式:"Append For Scala ...

  9. grpc是基于http/2协议的高性能的rpc框架

    师傅领进门,修行在个人,跟着官方脚手架demo了grpc后,之后就需要扩展前后知识边界,下面总结grpc的前世今生和最佳实践. https://www.cnblogs.com/JulianHuang/ ...

  10. Windows Server2016 默认使用英文输入法或默认使用中文输入法

    1.确认是Server2016操作系统及以后版本 2.打开开始菜单"设置"--"时间和语言" 3.添加英文输入法(已存在可以跳过) 找到"区域与语言& ...