codeforces B. Online Meeting 解题报告
题目链接:http://codeforces.com/problemset/problem/420/B
题目意思:给出一段连续的消息记录:记录着哪些人上线或者下线。问通过给出的序列,找出可能为leader的人的编号。符合leader的条件是:至少有一个人上线的时候,绝对要有该人(leader)的存在。
整个五一都把时间耗在这题里了......首先太感谢jhf大神,竟然可以这么有耐心的跟我这个陌生人讨论题目。但是,限于本人理解能力有点问题,在参考他写的代码里,还是有一些部分不太理解。
以下结合我的理解来说。首先,将有可能为leader的人分成两批:没有在序列中出现过的 + 在序列中有可能是leader的候选人。要知道记录里没有出现过的人都有可能是leader。然后,对于候选人又分成两批:整个记录中的第一人 + 记录中的某一个人。对于记录中第一个人为leader的情况有两种: (1)整个记录里只有上线的人,没有下线的; (2)整个记录里每个人第一次出现都是以上线形式出现,但记录中存在下线。这个时候最有可能为leader 的 非第一个人莫属了。对于有可能是记录中的某一个人(有可能不是第一个),需要符合:这些候选人第一次出现以 下线形式出现。
那总体的思路就是:挑出候选人,然后在候选人当中选出最后下线的,就是说,上线的人要在该人离开前都要下线。然后加上未出现过的人,就是答案了。
补充: 终于找到他的原话 + 我的补充了:
jhf:
1、先预处理 ,例如+1 -2 补充完整为: +2+1-2-1 这两个是等价的(因为所有的人都是先上线再下线)。实质上就是把直接下线而没有先上线的人的上线记录加在前面,例如-2+3-3-4-1,2 4 1直接下线了,他们是唯一有可能当leader的,然后试图从中再筛选,筛选的方法就是看这些人有没有中途在还有人在线的时候就下线了
2、然后遍历记录每走一条,淘汰那些不符合的人...
最终版:
|
x第一次出现是-x的形式的列为候选
|
|
如果没有这种的,把记录中的第一个数列为候选
|
|
然后开始进一步筛选
|
|
筛选就看这些候选中有没有在有人在线的情况下下线的
|
|
如果有就排除
|
|
然后加上那些没在记录中出现过得人就是答案
|
...
候选人在有人在线的情况下下线了
答:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; const int MAX_MSG = 1e5 + ;
const int MAX_PEOPLE = 1e5 + ;
int people, msg, init_num;
int ans[MAX_PEOPLE];
bool vis[MAX_PEOPLE], wait[MAX_PEOPLE]; // vis[]: 针对整个记录中没有出现过的人;wait[]:记录第一次出现是离线的人的编号 struct node
{
int id;
bool on;
}user[MAX_MSG]; void Input()
{
char ch;
scanf("%d%d", &people, &msg);
for (int i = ; i <= msg; i++)
{
cin >> ch >> user[i].id;
user[i].on = (ch == '+'); // 代表该人第一次出现是上线的
}
} void Make_wait() // 挑出候选人
{
memset(vis, , sizeof(vis));
memset(wait, , sizeof(wait));
bool did = false;
init_num = ;
for (int i = ; i <= msg; i++)
{
if (vis[user[i].id])
continue;
if (!user[i].on)
{
did = true;
init_num++; // 统计第一次出现是下线的人的数量
wait[user[i].id] = true;
}
vis[user[i].id] = true;
}
if (!did) // 候选人只有记录中的第一个人(不考虑!vis[])
wait[user[].id] = true;
} void Work() // 判断候选人
{
int on_num = init_num; // 第一次出现是以下线方式出现的人,即候选人
for (int i = ; i <= msg; i++)
{
if (user[i].on)
{
on_num++;
if (on_num == && !wait[user[i].id]) // 这条语句令我十分不解,可能是代表候选人是记录中的第一个人
{
memset(wait, , sizeof(wait));
}
continue;
}
on_num--;
if (!wait[user[i].id]) // 非候选人直接跳过
continue;
if (on_num > ) // 离线对应该人不是leader
wait[user[i].id] = false;
}
} void Output()
{
int ans_num = ;
for (int i = ; i <= people; i++)
{
if (!vis[i] || wait[i])
ans[++ans_num] = i;
}
printf("%d\n", ans_num);
if (!ans_num)
return;
for (int i = ; ans_num && i <= ans_num; i++)
printf("%d ", ans[i]);
puts("");
} int main()
{
Input();
Make_wait();
Work();
Output();
return ;
}
codeforces B. Online Meeting 解题报告的更多相关文章
- Codeforces Round 665 赛后解题报告(暂A-D)
Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 \(B\) 点 坐标为 \(x(x\leq n)\).由题意我们知道 \[\mid(n-x)- ...
- Codeforces Round 662 赛后解题报告(A-E2)
Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...
- Codeforces Round #277.5 解题报告
又熬夜刷了cf,今天比正常多一题.比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack.写写解题报告吧= =. 解题报告例如以下: A题:选择排序直接搞,由于不要求最优交换次 ...
- codeforces B. Simple Molecules 解题报告
题目链接:http://codeforces.com/problemset/problem/344/B 题目意思:这句话是解题的关键: The number of bonds of an atom i ...
- codeforces 591A. Wizards' Duel 解题报告
题目链接:http://codeforces.com/problemset/problem/591/A 题目意思:其实看下面这幅图就知道题意了,就是Harry 和 He-Who-Must-Not-Be ...
- codeforces 582A. GCD Table 解题报告
题目链接:http://codeforces.com/problemset/problem/582/A 网上很多题解,就不说了,直接贴代码= = 官方题解: http://codeforces.com ...
- codeforces 581C. Developing Skills 解题报告
题目链接:http://codeforces.com/problemset/problem/581/C 题目意思:给出 n 个数:a1, a2, ..., an (0 ≤ ai ≤ 100).给出值 ...
- codeforces 577B. Modulo Sum 解题报告
题目链接:http://codeforces.com/problemset/problem/577/B 题目意思:就是给出 n 个数(a1, a2, ..., an) 和 m,问能不能从这 n 个数中 ...
- codeforces 540B.School Marks 解题报告
题目链接:http://codeforces.com/problemset/problem/540/B 题目意思:给出 k 个test的成绩,要凑剩下的 n-k个test的成绩,使得最终的n个test ...
随机推荐
- ReSharper7.1.25.234 注册机
经常用vs做开发的人都知道,ReSharper是vistual studio必备插件之一.他的智能提示,智能感知,.net底层方法查看,测试等都非常方便,给程序员带来了巨大的效率. 但众所周知ReSh ...
- 安卓解析XML文件
安卓解析XML文件 主要有三种方式:DOM解析.SAX解析.PULL解析 其中: DOM解析为等XMl文件全部加载后,然后根据需要解析的内容解析出所需的内容数据. SAX解析为从XML文件中执行一行, ...
- R语言入门视频笔记--6--R函数之cat、format、switch函数
一.cat 猫 怎么就变成一个输出函数了呢? cat 一个输出函数,功能和print有相同之处 我们一起比较看看 1.cat(“hellow world”)或cat('hellow world') ...
- OSI模型详解
OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 . 完成中继功能的节点通常称为中继系统.在OSI七层模型中,处于 ...
- spring data jpa 查询部分字段
@Query("select new map(ah as ah,salq as sqlq,yg as yg, bg as bg,ay as ay) FROM Aj where ahdm=?1 ...
- #ifdef #endif #if #endif
c语言里所有以#开头的都是预编译指令,就是在正式编译之前,让编译器做一些预处理的工作. #ifdef DEBUG printf("variable x has value = %d\n&qu ...
- 常用业务返回对象类ResponseJson
目录 1.ResponseJson类 2.使用举例 1.ResponseJson类 import java.io.Serializable; public class ResponseJson imp ...
- PERL 源码 大神网站
http://blog.csdn.net/haoyujie/article/category/1187883 http://deepfuture.iteye.com/blog/816428
- 微信小程序 - 音频播放(1.2版本和1.2版本之后)
不多说了,直接贴code // 1.2版本以后便不在维护 wx.getBackgroundAudioManager({ success:function(res){ var status =res.s ...
- 【转载】lvs为何不能完全替代DNS轮询
上一篇文章"一分钟了解负载均衡的一切"引起了不少同学的关注,评论中大家争论的比较多的一个技术点是接入层负载均衡技术,部分同学持这样的观点: 1)nginx前端加入lvs和keepa ...