题意:N个人,每个人有a属性和b属性,如果一个人的a或者b大于另外一个人,我们说这个人可以打败那个人。且这种关系可以传递。对于每个人,输出他可以打败多少人。(保证每个a不相同,保证每个b不相同。

思路:对于a关系,我们按重小到大连边,b同理。然后每个点能到的点就是可以打败的点。即是缩点后乱搞。

(此题是图,而不是排序后的数据结构题。

#include<bits/stdc++.h>
#define pii pair<int,int>
#define F first
#define S second
using namespace std;
const int maxn=;
vector<int>G1[maxn],G2[maxn];
pii p1[maxn],p2[maxn];
int dfn[maxn],low[maxn],scc[maxn],scc_cnt,sz[maxn],ind[maxn];
int q[maxn],head,tail,times,ans[maxn],res[maxn],instk[maxn];
map<pii,int>mp;
void tarjan(int u)
{
instk[u]=; q[++head]=u;
dfn[u]=low[u]=++times;
for(int i=;i<G1[u].size();i++){
int v=G1[u][i];
if(!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instk[v])low[u]=min(low[u],dfn[v]);//无向图与有向图的区别
}
if(dfn[u]==low[u]){
scc_cnt++;
while(true){
int x=q[head--];
scc[x]=scc_cnt; sz[scc_cnt]++;
instk[x]=;
if(x==u) break;
}
}
}
int main()
{
int N,i,j;
scanf("%d",&N);
for(i=;i<=N;i++) scanf("%d%d",&p1[i].F,&p2[i].F),p1[i].S=p2[i].S=i;
sort(p1+,p1+N+);
sort(p2+,p2+N+);
for(i=;i<=N;i++) G1[p1[i].S].push_back(p1[i-].S);
for(i=;i<=N;i++) G1[p2[i].S].push_back(p2[i-].S);
for(i=;i<=N;i++) if(!dfn[i]) tarjan(i);
for(i=;i<=N;i++){
int L=G1[i].size();
for(j=;j<L;j++){
if(scc[i]!=scc[G1[i][j]]&&!mp[make_pair(scc[G1[i][j]],scc[i])]) mp[make_pair(scc[G1[i][j]],scc[i])]=,G2[scc[G1[i][j]]].push_back(scc[i]),ind[scc[i]]++;
}
}
head=tail=;
for(i=;i<=scc_cnt;i++) if(ind[i]==) q[++head]=i;
while(tail<head){
int u=q[++tail];
int L=G2[u].size();
for(j=;j<L;j++){
sz[G2[u][j]]+=sz[u];
if((--ind[G2[u][j]])==) q[++head]=G2[u][j];
}
}
for(i=;i<=N;i++) printf("%d\n",sz[scc[i]]-);
return ;
}

Gym 101142C :CodeCoder vs TopForces(强连通算法)的更多相关文章

  1. Gym 101142C CodeCoder vs TopForces (搜索)

    题意:每个人有2种排名,对于A只要有一种排名高于B,那么A就能赢B,再如果B能赢C,那么A也能赢C,要求输出每个人分别能赢多少个人 析:首先把题意先读对了,然后我们可以建立一个图,先按第一种排名排序, ...

  2. 【DFS】Gym - 101142C - CodeCoder vs TopForces

    就按照题意建出有向图来(n个点,2n-2条边),然后从按随便一个rating排序,从最后一个开始dfs,用vis数组防止重复访问,因为每次之前的肯定能访问之后的(及之后的能访问的),所以不会有重复.就 ...

  3. Gym - 101142C CodeCoder vs TopForces(搜索)

    题意:给定n个人在两个网站上的得分,一个人若能在任意一个网站里战胜另一个人,则认为这个人能战胜那个人.问每个人都能战胜多少人. 分析: 1.战胜具有传递性. 例如: 4 5 2 7 3 3 因为第三个 ...

  4. C - CodeCoder vs TopForces Gym - 101142C (连通块+思维)

    题目链接: C - CodeCoder vs TopForces Gym - 101142C 题目大意:给你n个人的信息,每一个人的信息包括两个.t1和t2.A>B的前提是A的t1和t2至少有一 ...

  5. Codeforces Gym 101142C:CodeCoder vs TopForces(搜索)

    http://codeforces.com/gym/101142/attachments 题意:每个人在TC和CF上分别有两个排名,如果有一个人在任意一个网站上大于另一个人的排名,那么这个人可以打败另 ...

  6. Codeforces Gym 101142 C. CodeCoder vs TopForces(思维+图论)

    题意: 每个人有两个积分CC和TF 第i个人能战胜第j个人的条件满足下面两个条件中的一个即可 1.CCi > CCj 或 TFi > TFj 2.i能战胜k,k能战胜j. 题解: 先按CC ...

  7. Gym 101873D - Pants On Fire - [warshall算法求传递闭包]

    题目链接:http://codeforces.com/gym/101873/problem/D 题意: 给出 $n$ 个事实,表述为 "XXX are worse than YYY" ...

  8. 有向图的强连通算法 -- tarjan算法

    (绘图什么真辛苦) 强连通分量: 在有向图 G 中.若两个顶点相互可达,则称两个顶点强连通(strongly connected). 假设有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有 ...

  9. Tourists Gym - 101002I LCA——dfs+RMQ在线算法

    LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先). 知识需求:1)RMQ的S ...

随机推荐

  1. PHP-Manual的学习----【语言参考】----【类型】-----【对象】

    Object 对象1.对象初始化要创建一个新的对象 object ,使用 new 语句实例化一个类: class foo{    function do_foo(){        echo &quo ...

  2. Windows系统SVN服务器搭建与使用

    下载svn:https://tortoisesvn.net/downloads.zh.html下载svn服务器:https://www.visualsvn.com/server/download/(如 ...

  3. Python菜鸟之路:Python操作MySQL-即pymysql/SQLAlchemy用法

    上节介绍了Python对于RabbitMQ的一些操作,本节介绍Python对于MySQL的一些操作用法 模块1:pymysql(等同于MySQLdb) 说明:pymysql与MySQLdb模块的使用基 ...

  4. 转载一篇将C/C++ 与lua混合使用入门讲的比较好的文章

    转自 http://www.open-open.com/home/space-6246-do-blog-id-1426.html Lua是一个嵌入式的脚本语言,它不仅可以单独使用还能与其它语言混合调用 ...

  5. SSAS(SQL Server 分析服务)、***S(SQL Server报表服务)、SSIS(SQL Server集成服务)

    一.数据仓库入门 实验手册 1. 创建数据源  http://jimshu.blog.51cto.com/3171847/13366622. 创建数据源视图 http://jimshu.blog.51 ...

  6. jQuery实现复选框全选/所有取消/反选/获得选择的值

    <!DOCTYPE html> <html> <head> <script type="text/javascript" src=&quo ...

  7. 关于js中undefined的判断

    在开发中遇到一个情景,当添加用户的时候不需要传入用户id,如果是修改那么需要传入id,因为用的是angular框架,参数是早就定义好了的,那么在新增用户的时候就会出现undefined的情况,之前我一 ...

  8. LeetCode:长度最小的子数组【209】

    LeetCode:长度最小的子数组[209] 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 ...

  9. oracle游标用法

    -- 声明游标:CURSOR cursor_name IS select_statement  --For 循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个游标 ...

  10. rails数据验证

    @user1 = :name => "zhou" 与 @user2 = :name=> "ZHOU" 在为保存之前都有可能通过第一关validate ...