kZjPBD.jpg

Gym 101142C CodeCoder vs TopForces【思维+Dfs】


题目大意:

 

如果A>B,并且B>C,那么有A>C,现在A>B的条件是,A的两个元素中的至少一个大于B。

问一个人可以打败多少人。

 

思路:


①问题其实就是在找一个联通块,我们将元素按照x从小到大排序一下,然后相邻的两个点建一条边。

②然后在将元素按照y从小到大排序一下,然后相邻的两个点再建一条边。

然后每个点Dfs一下统计即可。

一开始的时候,我想的是两个关键字分别排一次序,分别记一下名次

按第一关键字排序,在第一关键子小于他的找到一个第二关键字的排名最小的

然后按第二关键字再来一次。

后来怎么都wa,原因可能是因为关系太复杂,而排序之后就全是线性的关系了,许多关系就考虑不到了

还是dfs稳qwq





 

 

 

 

复制代码
 1 #include"bits/stdc++.h"
 2 using namespace std;
 3 
 4 struct aa
 5 {
 6  int id1;
 7  int id2;
 8  int pos;
 9  int ans;
10  int a,b;
11 
12 }a[1000000];
13 
14 vector<int> v[200000];
15 int vis[200000];
16 
17 
18 int cmp(aa a,aa b)
19 {
20  return a.a>b.a;
21 }
22 
23 int cmp2(aa a,aa b)
24 {
25  return a.b>b.b;
26 }
27 int cmp3(aa a,aa b)
28 {
29  return a.pos<b.pos;
30 }
31 
32 int n;
33 
34 
35 int ans[2000000];
36 int cnt;
37 
38 void dfs(int x)
39 {
40     vis[x]=1;
41     cnt++;
42     for (auto i:v[x])if(!vis[i])dfs(i);
43     return ;
44 }
45 
46 int main()
47 {
48      freopen("codecoder.in","r",stdin);
49 // 
50             freopen("codecoder.out","w",stdout);
51  
52 cin>>n;
53 
54  for (int i=1;i<=n;i++)
55  cin>>a[i].a>>a[i].b,a[i].pos=i;
56  
57  sort(a+1,a+1+n,cmp);
58  
59  for (int i=1;i<n;i++)v[a[i].pos].push_back(a[i+1].pos);
60  
61  sort(a+1,a+1+n,cmp2);
62  for (int i=1;i<n;i++)v[a[i].pos].push_back(a[i+1].pos); 
63  
64  for (int i=n;i;i--)
65  {
66      if(!vis[a[i].pos])dfs(a[i].pos);
67      ans[a[i].pos]=cnt;
68      
69  }
70  
71 for (int i=1;i<=n;i++)cout<<ans[i]-1<<endl;; 
72 
73 
74  
75  
76  
77  
78  
79 }
复制代码

 

posted @   Through_The_Night  阅读(221)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
点击右上角即可分享
微信分享提示