CF - 420B - Online Meeting(思维)
来源:互联网 发布:light room2017 mac 编辑:程序博客网 时间:2024/06/07 12:44
题意:n 个人参加线上会议,某经理记录了中间一段时间的 m 条上下线记录(1 ≤ n, m ≤ 105)。+ 表示上线,- 表示下线。leader是指只要有人在线,他都在线的人。求所有可能的leader。
题目链接:http://codeforces.com/problemset/problem/420/B
——>>这样的一种人,他们在记录中的第一条记录是下线的,定义为xx。。
三个断言:
1)如果xx存在,那么出现的人中,leader只可能是最后出现的那个xx。。
2)如果xx不存在,那么出现的人中,leader只可能是第一个登录的人。。
3)没出现过的人都可以是leader。。
#include <cstdio>#include <set>using std::set;const int MAXN = 100000 + 10;int n, m;char op[MAXN];int p[MAXN];int sum, leader;int firstPlus = -1, lastInfinite = -1;bool vis[MAXN];void Init(){ sum = n; for (int i = 1; i <= n; ++i) { vis[i] = true; }}void Read(){ for (int i = 1; i <= m; ++i) { getchar(); scanf("%c%d", op + i, p + i); if (op[i] == '-' && vis[p[i]] == true) { lastInfinite = p[i]; } if (firstPlus == -1 && op[i] == '+') { firstPlus = p[i]; } if (vis[p[i]]) { vis[p[i]] = false; --sum; } }}void Solve(){ set<int> se; leader = lastInfinite == -1 ? firstPlus : lastInfinite; if (lastInfinite != -1) { se.insert(leader); } for (int i = 1; i <= m; ++i) { if (op[i] == '+') { se.insert(p[i]); if (se.find(leader) == se.end()) { leader = -1; break; } } else { if (!se.empty()) { se.erase(p[i]); } if (!se.empty() && se.find(leader) == se.end()) { leader = -1; break; } } } if (leader != -1) { vis[leader] = true; ++sum; }}void Output(){ printf("%d\n", sum); if (sum == 0) return; bool first = true; for (int i = 1; i <= n; ++i) { if (vis[i]) { if (first) { first = !first; } else { printf(" "); } printf("%d", i); } } puts("");}int main(){ while (scanf("%d%d", &n, &m) == 2) { Init(); Read(); Solve(); Output(); } return 0;}
0 0
- CF - 420B - Online Meeting(思维)
- Codeforces 420 B. Online Meeting
- codeforces 420B Online Meeting
- CodeForces 420B Online Meeting
- Online Meeting - CodeForces 420B 水题
- CF 421C Online Meeting
- codeforces 402 B Online Meeting
- 【CF 699B】One Bomb(思维)
- CF 527B 思维题
- CF#420 B. Okabe and Banana Trees 思维|暴力|几何
- CF#798 B. Mike and strings(思维)
- CF#804 B. Minimum number of steps(字符串,思维)
- CF#877 B. Nikita and string(思维,暴力)
- cf 469B Chat Online 暴力
- cf 782B The Meeting Place Cannot Be Changed
- Codeforces Round #433 (Div. 1) B Jury Meeting(思维)
- cf(思维题)
- cf(思维,数学)
- mysql建表
- U盘挂载问题
- Linux source命令
- ProjectEuler - 8
- linux缩写解析
- CF - 420B - Online Meeting(思维)
- iOS生成最大最小数之间随机数
- 几个cd快捷技巧
- 64位win7的adb连不上的解决方法
- Android曝重大漏洞,小分队已掌握其技术细节
- GCD 深入理解(一)
- spring中配置sessionfactory使xml和annotation可以同时使用
- 用Python的Turtle模块绘制五星红旗
- MFC中对CListCtrl的使用总结