Gym101142C CodeCoder vs TopForces
Posted 2855669158
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gym101142C CodeCoder vs TopForces相关的知识,希望对你有一定的参考价值。
题意:有n个人,每一个人有两个分数,只要一个人大于另一个人的一个分数,那么这个人就有可能打败另一个人,(有传递性,比如1,3->10,2, 10,2->9,9那么1,3->9,9)
题解:分别按两种分数排序,那么最大的一定可以打败比他小的所有人,他要打败最多的人,那么只能打败他相邻的人(传递性),那么就是对每个点找最长路,n^2不能过这里可以发现有很多重复的,也就是说当前这个点的能到的点,其父节点也可以到达,所以只要从最小的点开始搜索,标记及答案不清空
#include <bits/stdc++.h> #define maxn 101000 #define INF 0x3f3f3f3f typedef long long ll; using namespace std; struct node { int a, b, c, ans; }t[maxn]; int sum, dir[maxn]; vector<int>G[maxn]; int cmp1(node aa,node bb){ return aa.a<bb.a; } int cmp2(node aa, node bb){ return aa.b<bb.b; } int cmp3(node aa,node bb){ return aa.c<bb.c; } void dfs(int x){ sum++; dir[x] = 1; for(int i=0;i<G[x].size();i++){ if(dir[G[x][i]] == 0){ dfs(G[x][i]); } } } int main(){ int n; //freopen("codecoder.in","r",stdin); freopen("codecoder.out","w",stdout); scanf("%d", &n); for(int i=0;i<n;i++){ scanf("%d%d", &t[i].a, &t[i].b); t[i].c = i; } sort(t, t+n, cmp1); for(int i=n-1;i>0;i--){ G[t[i].c].push_back(t[i-1].c); } sort(t, t+n, cmp2); for(int i=n-1;i>0;i--){ G[t[i].c].push_back(t[i-1].c); } for(int i=0;i<n;i++){ if(dir[t[i].c] == 0){ dfs(t[i].c); } t[i].ans = sum-1; } sort(t, t+n, cmp3); for(int i=0;i<n;i++){ printf("%d\n", t[i].ans); } return 0; }
以上是关于Gym101142C CodeCoder vs TopForces的主要内容,如果未能解决你的问题,请参考以下文章
Gym 101142C CodeCoder vs TopForces (搜索)
Codeforces Gym 101142 C. CodeCoder vs TopForces(思维+图论)
宽搜ECNA 2015 D Rings (Codeforces GYM 100825)
The Stream of Corning 2 --- Gym - 102091K(区间第 k 大--权值线段树)
最短路NEERC15 F Froggy Ford(2015-2016 ACM-ICPC)(Codeforces GYM 100851)