[Codeforces 878C] Tournament
来源:互联网 发布:朱文泉老婆泄密知乎 编辑:程序博客网 时间:2024/06/10 04:41
题目链接: http://codeforces.com/problemset/problem/878/C
题目大意: 有一个锦标赛, 一共有n名运动员参加,k种运动项目。 第i个运动员的第k个项目的能力值记为
思路: 考虑转换模型。 如果每一个运动员看成一个点, 如果i有可能打败j则连一条i->j的有向边。 则答案即为强连通分量缩点后, 入度为0的那个强连通分量所包含的点的个数。
考虑这个图的特征, 每两个点之间一定至少有一条边。 作强连通分量缩点后, 两个点之间仅有一条有向边, 即为该点的所有运动项目都是“完全碾压”另一个点的。 我们可以将“完全碾压”这个关系重载小于号, 将强连通分量们按此排序。 每个强连通分量维护每项运动的最小值与最大值和所包含的点的个数。
考虑新加入一个点, 最后一个大于它的强连通分量l, 与第一个小于它的强连通分量r, 则该点将与[l + 1, r - 1]中的所有点合并成一个新的强连通分量并重新插入序列中。 该过程可以用set来实现。
#include <set>#include <queue>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int inf = 1 << 30;int n, k;struct Node{ int mx[20], mn[20], sz; void init(int _, int __){ for (int i = 1; i <= k; i ++) mx[i] = mn[i] = _; sz = __; } bool operator<(const Node &_) const{ for (int i = 1; i <= k; i ++){ if (mx[i] > _.mn[i]) return 0; } return 1; } void unit(const Node &_){ sz += _.sz; for (int i = 1; i <= k; i ++) mx[i] = max(mx[i], _.mx[i]), mn[i] = min(mn[i], _.mn[i]); }};set<Node > S;vector< set<Node > :: iterator > del;int main(){ scanf("%d%d", &n, &k); Node tmp; tmp.init(0, 0); S.insert(tmp); tmp.init(inf, 0); S.insert(tmp); for (int i = 1; i <= n; i ++){ tmp.sz = 1; for (int j = 1; j <= k; j ++) scanf("%d", tmp.mx + j), tmp.mn[j] = tmp.mx[j]; set<Node > :: iterator l, r, it; l = S.lower_bound(tmp); r = S.upper_bound(tmp); for (it = l; it != r; it ++){ del.push_back(it); tmp.unit(*it); } for (int j = 0; j < del.size(); j ++) S.erase(del[j]); del.clear(); S.insert(tmp); it = S.end(); it --; it --; printf("%d\n", it -> sz); } return 0;}
阅读全文
1 0
- [Codeforces 878C] Tournament
- codeforces 357C Knight Tournament
- codeforces 878C Tournament平衡树,好题!!!!
- CodeForces 357C - Knight Tournament(模拟)
- Codeforces #356C: Knight Tournament 题解
- Codeforces Round #443 (Div. 1) C. Tournament
- Codeforces Round #207 (Div. 2) C. Knight Tournament
- Codeforces Round #207 (Div. 2) C. Knight Tournament
- Codeforces Round #207 (Div. 2) C. Knight Tournament
- Codeforces Round #207 (Div. 2) C. Knight Tournament (并查集缩点)
- Codeforces Round #207 (Div. 2)---C. Knight Tournament(set乱搞)
- Codeforces Round #207 (Div. 2) C - Knight Tournament
- Codeforces 357C Knight Tournament【并查集】
- Codeforces Round #443 (Div. 1) C. Tournament(瞎搞???)
- Knight Tournament CodeForces
- CodeForces - 357C C - Knight Tournament 并查集or set模拟
- Codeforces 628A Tennis Tournament
- CodeForces 628A Tennis Tournament
- eclipse中启动Tomcat时报Multiple Contexts have a path of ‘/xxxx’的解决方案
- 洛谷P1910 L国的战斗之间谍
- Struts入门程序示例及基本执行过程
- 背包1
- 深入剖析ThreadLocal实现原理以及内存泄漏问题
- [Codeforces 878C] Tournament
- 51 nod 1246 罐子和硬币
- 【神经网络与深度学习】neural-style、chainer-fast-neuralstyle图像风格转换使用
- js中window对象的常用函数
- python对list去重的各种方法
- 从零开始前端学习[48]:js中的变量和this的初步认识
- 使用keras实现简单的前向全连接神经网络
- 取字母组成串
- LeetCode2. Add Two Numbers