CF 1638C - Inversion Graph 题解

题面:

给一个序列,i和j之间可以连边当且仅当i>j && a[i]<a[j] ,问共有多少个连通快

一道有趣的思维题

思路:

设mx为前mx位置上a[i]的最大值,当mx >= i时说明i可以加入到当前连通块中(等于时说明前i个数都在前面,大于时说明i后面有一个数小于mx可以让他前面与mx之间的数与mx相连)

mx<i说明前面的联通块连结完毕,新增一个连通块

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 2e5+5;
 4 int a[N];
 5 int main()
 6 {
 7     int t;
 8     scanf("%d", &t);
 9     while(t--){
10         int n, mx = 0, ans = 0;
11         scanf("%d", &n);
12         
13         for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
14         
15         for(int i = 1; i <= n; i++)
16         {
17             if(mx >= i)
18             {
19                 mx = max(mx, a[i]);
20             }else{
21                 mx = a[i];
22                 ans++;
23             }
24         }
25         printf("%d\n",ans);
26     }
27     return 0;
28 }

 

posted on 2023-01-10 10:15  玛卡巴卡要ac  阅读(30)  评论(0)    收藏  举报

导航