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 }
浙公网安备 33010602011771号