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 ...
随机推荐
- 洛谷 [T21776] 子序列
题目描述 你有一个长度为 \(n\) 的数列 \(\{a_n\}\) ,这个数列由 \(0,1\) 组成,进行 \(m\) 个的操作: \(1\ l\ r\) :把数列区间$ [l,r]$ 内的所有数 ...
- 洛谷P2365 任务安排 [解法一]
题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti.在每批任务开始 ...
- Codeforces891C. Envy
$n \leq 5e5$,$m \leq 5e5$的无向边权图,$q \leq 5e5$个询问,每次问一系列边是否能同时存在于某棵最小生成树上. 一条边在最小生成树上,当比他小的边都加入后,加入他会使 ...
- Codeforces Round #265 (Div. 2) C 暴力+ 找规律+ 贪心
C. No to Palindromes! time limit per test 1 second memory limit per test 256 megabytes input standar ...
- HDU4850 构造一个长度为n的串,要求任意长度为4的子串不相同
n<=50W.(使用26个字母) 构造方法:26个,最多构造出26^4种不同的串,长度最长是26^4+3,大于是输出"impossble",用四维数组判重.每次向前构造一位( ...
- linux top %VSZ含义
https://blog.csdn.net/sinohenu/article/details/58216013 https://unix.stackexchange.com/questions/449 ...
- 实现TTCP (检测TCP吞吐量)
实现TTCP (检测TCP吞吐量) 应用层协议 为了解决TCP粘包问题以及客户端阻塞问题 设计的应用层协议如下: //告知要发送的数据包个数和长度 struct SessionMessage { in ...
- 【WEB基础】HTML & CSS 基础入门(6)超链接
超链接--文字链接 超链接[hyperlink]是网页中最为常见的元素之一,我们几乎可以在所有的网站页面中找到超链接.每个网站都不止一个页面,这些页面就是利用超链接进行串接.超链接帮我们实现了网页与网 ...
- LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位
#3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...
- 常用业务返回对象类ResponseJson
目录 1.ResponseJson类 2.使用举例 1.ResponseJson类 import java.io.Serializable; public class ResponseJson imp ...