Codeforces 670C (离散化入门题)
原题链接:https://codeforces.com/problemset/problem/670/C
题目大意:
有 n 个人,每人会且仅会一种语言. (n ≤ 2e5)
语言有各自的编号(≤ 1e9)
这些人去看电影,一共有 m 种电影. (m ≤ 2e5)
每个电影的声音与字幕语言都不一样.
若有人的语言与声音语言一样,则称这个人很高兴♂.
若有人的语言与字幕语言一样,则称这个人比较高兴.
现让你选择一场电影,使得此电影中,很高兴的人最多,在此条件下,再使比较高兴的人最多.
分析:
因为要统计每种语言的人数,而语言编号 ≤ 1e9,存不下.
所以考虑离散化.
可得离散化之后,语言总数最多 n + 2m 种.
AC代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 2e5 + 5;
int n, m;
int a[maxn], b[maxn], c[maxn];
int sum[maxn * 3];
int cnt, mm;
int arr[maxn * 3], num[maxn * 3];
void discrete() {//离散化
sort(arr + 1, arr + cnt + 1);
for (int i = 1; i <= cnt; i++) {
if (i == 1 || arr[i] != arr[i - 1])
num[++mm] = arr[i];
}
}
int query(int x) {//二分查找x的位置
return lower_bound(num + 1, num + mm + 1, x) - num;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {//将所有电影和人涉及的语言放进一个数组,排序并离散化
scanf("%d", &a[i]);
arr[++cnt] = a[i];
}
scanf("%d", &m);
for (int i = 1; i <= m; i++) {
scanf("%d", &b[i]);
arr[++cnt] = b[i];
}
for (int i = 1; i <= m; i++) {
scanf("%d", &c[i]);
arr[++cnt] = c[i];
}
discrete();//离散化
for (int i = 1; i <= n; i++) {
int id = query(a[i]);//统计每种语言的人的数量
++sum[id];
}
int bmax = -1, cmax = -1, ans = 0;
for (int i = 1; i <= m; i++) {//选择满足题目要求的电影
int x = query(b[i]);
int y = query(c[i]);
if (sum[x] > bmax) {//优先考虑让很高兴的人最多
bmax = sum[x], cmax = sum[y];
ans = i;
}
else {
if (sum[x] == bmax && sum[y] > cmax) {//如果答案不唯一、则在此前提下再让比较高兴的人最多
bmax = sum[x], cmax = sum[y];
ans = i;
}
}
}
printf("%d\n", ans);
return 0;
}
暴力解法:670ms
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int>PII;
int n, m;
int a[20000005];
map<int, int>mp;
int main() {
//freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0);
cin >> n;
for (int i = 1, a; i <= n; ++i)
cin >> a, mp[a]++;
int k, max1 = -1, max2 = -1;
cin >> m;
for (int i = 1; i <= m; ++i) {
cin >> a[i];
max1 = max(max1, mp[a[i]]);
}
for (int i = 1,b; i <= m; ++i) {
cin >> b;
if (mp[a[i]] == max1 && mp[b] > max2)
max2 = mp[b], k = i;
}
cout << k << endl;
}
Codeforces 670C (离散化入门题)的更多相关文章
- POJ1151-扫面线+线段树+离散化//入门题
比较水的入门题 记录矩形竖边的x坐标,离散化排序.以被标记的边建树. 扫描线段树,查询线段树内被标记的边.遇到矩形的右边就删除此边 每一段的面积是查询结果乘边的横坐标之差,求和就是答案 #includ ...
- hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- poj 2524:Ubiquitous Religions(并查集,入门题)
Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 23997 Accepted: ...
- poj 3984:迷宫问题(广搜,入门题)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7635 Accepted: 4474 Description ...
- 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 ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- zstu.4194: 字符串匹配(kmp入门题&& 心得)
4194: 字符串匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 206 Solved: 78 Description 给你两个字符串A,B,请 ...
- hrbustoj 1073:病毒(并查集,入门题)
病毒Time Limit: 1000 MS Memory Limit: 65536 KTotal Submit: 719(185 users) Total Accepted: 247(163 user ...
- hdu 1465:不容易系列之一(递推入门题)
不容易系列之一 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
随机推荐
- 解密Spring Cloud微服务调用:如何轻松获取请求目标方的IP和端口
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 目的 Spring Cloud 线上微服务实例都是2个起步,如果出问题后,在没有ELK等日志分析平台,如何确定调用到了目标 ...
- Codeforces Round #656 (Div. 3) E. Directing Edges(拓扑排序)
题目传送门 首先发现初始图五有向环的话那么肯定是"YES",否则是"NO".然后找到一种满足要求地建树规则即可.这里采用拓扑排序建树,先dfs找出目前点的拓扑序 ...
- HTML5语法总结大全
参考书籍: <HTML与CSS3基础教程> 参考视频: HTML5完整教学通俗易懂 2023新版前端Web开发HTML5+CSS3+移动web视频教程,前端web入门首选黑马程序员 参考网 ...
- 上传代码到github和删除.git
在本地建立目录,将想上传的代码放到该文件夹中 git init ###初始化 git add . ###将本地项目工作区的所有文件添加到暂存区 git commit -m "excu&quo ...
- C与Verilog差别
C没有时钟概念,Verilog有时钟边沿触发. C无建立保持时间要求,Verilog要计算建立保持时间,并进行优化 C与工艺无关,Verilog依赖底层工艺cell,相同代码不同cell差异较大. V ...
- [THUPC 2023 初赛] 快速 LCM 变换
题目描述 小 I 今天学习了快速最小公倍数变换(Fast Least-Common-Multiple Transform, FLT),于是他想考考你. 给定一个长度为 \(n\) 的正整数序列 \(r ...
- out.print()
在学习过程中发现跟着视频打out.print报错 查阅资料知道 新建Java工程时,应选择Java Enterprise而非Java里的webapplication(Java Enterprise会自 ...
- GPT Zero 是什么?
from https://openaigptguide.com/gptzero/ 在人工智能技术飞速发展的今天,人们对于文字内容的准确性和可信度要求越来越高.例如在学术研究领域,防止抄袭和造假是非常重 ...
- 内网& 公网
内.外网是相对于防火墙而言的,在防火墙内部叫做内网,反之就是外网.在一定程度上外网等同于公网,内网等同于私网. 内网IP是什么? 内网IP简单理解就是局域网IP地址.内网地址即局域网(LAN),内网的 ...
- Shell脚本实践总结
对比大小 符号用法:(必须使用双括号) < 小于 (( "$a" < "$b" )) <= 小于等于 (( "$a&q ...