题目链接: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的形式的列为候选
 
如果没有这种的,把记录中的第一个数列为候选
 
然后开始进一步筛选
 
筛选就看这些候选中有没有在有人在线的情况下下线的
 
如果有就排除
 
然后加上那些没在记录中出现过得人就是答案

...

候选人在有人在线的情况下下线了

答:

用一个bool数组标记出候选人
用一个int记录当前在线人数
查bool数组判断他是不是候选人,再看在线人数
 
 #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 解题报告的更多相关文章

  1. Codeforces Round 665 赛后解题报告(暂A-D)

    Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 \(B\) 点 坐标为 \(x(x\leq n)\).由题意我们知道 \[\mid(n-x)- ...

  2. Codeforces Round 662 赛后解题报告(A-E2)

    Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...

  3. Codeforces Round #277.5 解题报告

    又熬夜刷了cf,今天比正常多一题.比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack.写写解题报告吧= =. 解题报告例如以下: A题:选择排序直接搞,由于不要求最优交换次 ...

  4. codeforces B. Simple Molecules 解题报告

    题目链接:http://codeforces.com/problemset/problem/344/B 题目意思:这句话是解题的关键: The number of bonds of an atom i ...

  5. codeforces 591A. Wizards' Duel 解题报告

    题目链接:http://codeforces.com/problemset/problem/591/A 题目意思:其实看下面这幅图就知道题意了,就是Harry 和 He-Who-Must-Not-Be ...

  6. codeforces 582A. GCD Table 解题报告

    题目链接:http://codeforces.com/problemset/problem/582/A 网上很多题解,就不说了,直接贴代码= = 官方题解: http://codeforces.com ...

  7. codeforces 581C. Developing Skills 解题报告

    题目链接:http://codeforces.com/problemset/problem/581/C 题目意思:给出 n 个数:a1, a2, ..., an (0 ≤ ai ≤ 100).给出值 ...

  8. codeforces 577B. Modulo Sum 解题报告

    题目链接:http://codeforces.com/problemset/problem/577/B 题目意思:就是给出 n 个数(a1, a2, ..., an) 和 m,问能不能从这 n 个数中 ...

  9. codeforces 540B.School Marks 解题报告

    题目链接:http://codeforces.com/problemset/problem/540/B 题目意思:给出 k 个test的成绩,要凑剩下的 n-k个test的成绩,使得最终的n个test ...

随机推荐

  1. 【HDOJ5952】Counting Cliques(团,dfs)

    题意:给定一张n点m边的图,求大小为S的团的个数 N ≤ 100,M ≤ 1000,2 ≤ S ≤ 10,保证点的度不超过20 思路:dfs 因为每个点可能不止属于一个极大团,所以不能求出极大团然后计 ...

  2. Yii 之视图数据块

    控制器代码: public $layout = 'common'; public function actionStudent(){ $data = array('page_name'=>'St ...

  3. Redis命令行之List

    一.Redis之List简介 1. List是简单的字符串列表,按照插入顺序排列. 2. 一个列表最多可存储232-1个元素(40多亿). 二.Redis之List命令行操作 Lrange:获取列表指 ...

  4. Java 新手进阶:细说引用类型

    在前几天的帖子<Java性能优化[1]:基本类型 vs 引用类型>里,俺大概介绍了“引用类型”与“基本类型”在存储上的区别.昨天有网友在评论中批评说“引用类型变量和它所引用的对象”没区分清 ...

  5. Debian9初始配置

    1 进入root用户 su root 2 修改镜像源:编辑/etc/apt/sources.list文件 nano /etc/apt/sources.list 修改内容如下: deb http://m ...

  6. OpenCV、PCL;Xtion、kinect;OpenNI、kinect for windows SDK比较

    一.对比介绍: 1. OpenCV:开源跨平台,OpenCV于1999年由Intel建立,如今由Willow Garage提供支持. 2. OpenNI:OpenNI组织创建于2010年11月.主要成 ...

  7. CODEVS_1227 方格取数2 网络流 最小费用流 拆点

    原题链接:http://codevs.cn/problem/1227/ 题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1, ...

  8. android 环境变量配置,以及sdcard配置

    第一步,打开环境变量配置窗口.右击计算机,属性-高级系统设置-环境变量. 第二步,添加android系统环境变量.在系统变量下,选择path,点击编辑,然后在最前面输入android sdk开发工具, ...

  9. Spring注入内部的Beans

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/injecting-inner-beans.html: 如你所知,Java内部类在其他类的范围内定义 ...

  10. 揭秘jbpm流程引擎内核设计思想及构架

    揭秘jbpm流程引擎内核设计思想及构架 作者 胡长城(银狐999)   1     前言 2     阅读本篇的基础准备 2.1      概念的基础 2.2      环境的基础 3     什么是 ...