【题目描述】
现在有一个序列p1,p2,…,pnp_1,p_2,\dots ,p_np1​,p2​,…,pn​,你需要构建一个无向图,规则是:当i<ji<ji<j且pi>pjp_i>p_jpi​>pj​时在iii和jjj之间连一条无向边。问最后图中会有几个连通块。

【输入格式】
第一行一个整数t(1≤t≤105)t(1\leq t\leq 10^5)t(1≤t≤105),表示测试组数。
每组第一行一个整数n(1≤n≤105)n(1\leq n\leq 10^5)n(1≤n≤105),表示数列的长度。
每组第二行nnn个整数p1,p2,…,pn(1≤pi≤n)p_1,p_2,\dots ,p_n(1\leq p_i\leq n)p1​,p2​,…,pn​(1≤pi​≤n),表示给定的数列。
可以保证ttt组测试的nnn的和不超过2×1052\times 10^52×105。

【输出格式】
共ttt行。
对于每组测试,输出一个整数kkk表示连通块的数量。

【输入样例】

6
3
1 2 3
5
2 1 4 3 5
6
6 1 4 2 5 3
1
1
6
3 2 1 6 5 4
5
3 1 5 2 4

【输出样例】

3
3
1
1
2
1

【样例解释】

【分析】


考虑有两个数字100,20100,20100,20,中间夹了一个数xxx:

100→20100\to 20100→20显然有边,而满足下面两个条件中的任意一个,xxx都会被连到这个连通块里。

  • x<100x<100x<100
  • x>20x>20x>20

显然xxx必被连到连通块里。也就是说,对于某个数pip_ipi​,对于任意在它右侧且比它小的pjp_jpj​,区间[i,j][i,j][i,j]中的所有数都会是一个连通块。对于连通块[l,r][l,r][l,r]中最大的数pip_ipi​,同理可以延申到pr′p_r'pr′​,则[l,r′][l,r'][l,r′]可以更新原来的连通块。那么当r=r′r=r'r=r′时就不再能更新了。

我们可以发现每个连通块在原序列中是连续的。如果pip_ipi​后有小于pip_ipi​的元素,那么两数之间一定会构成一个逆序对,那么一个连通块就不可能以pip_ipi​结尾。反之,如果所有比pip_ipi​小的都在pip_ipi​之前,也就是说1→pi1\to p_i1→pi​(含pip_ipi​)构成了iii的全排列,那么一个连通块一定以pip_ipi​结尾。

假设maxv[i]maxv[i]maxv[i]表示1∼i1\sim i1∼i中最大的数,如果maxv[i]==imaxv[i]==imaxv[i]==i,说明p1,p2,…,pip_1,p_2,\dots ,p_ip1​,p2​,…,pi​一定是1∼i1\sim i1∼i的全排列,iii之后一定没有小于maxv[i]maxv[i]maxv[i]的元素了,因此该连通块已经以pip_ipi​结尾了,连通块数量加一。


【代码】

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;int main()
{int T;cin >> T;while (T--){int n, w;cin >> n;int smax = 0, res = 0;for (int i = 1; i <= n; i++){cin >> w;smax = max(smax, w);if (smax == i) res++;}cout << res << endl;}return 0;
}

【CF1638C】Inversion Graph(连通块,思维题)相关推荐

  1. 树形dp ---- gym101655 D - Delta Quadrant 树上连通块思维换根 + 树形dp

    题目链接 题目大意: 给你一颗NNN个节点的树,树上每条边有边权就是遍历的时间,你可以从任意节点出发遍历N−kN-kN−k个点并且回到出发点,问你最短的时间是多少? k∈[0,min(N,20)],N ...

  2. [C] [编程题]连通块(DFS解决)

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 256M,其他语言512M 来源:牛客网 金山办公2020校招服务端开发工程师笔试题(一) 题目描述 给一个01矩阵,1代表是陆地,0代表 ...

  3. 挑战 渣打科营“Mini Code Marathon”赛题:连通块最少

    package csdn; /** * 渣打科营"Mini Code Marathon"赛题:连通块最少 * @author Cheeps * 思路:在同一个全1连通块中,任何两个 ...

  4. CF1139C Edgy TreesDFS求连通块大小、思维

    题目 题目链接 给一颗树,每条边都是红或黑的.问有多少种大小为kkk的序列[a1,a2...,ak][a_1,a_2...,a_k][a1​,a2​...,ak​]满足,从a1a_1a1​到a2a_2 ...

  5. C. Edgy Trees Codeforces Round #548 (Div. 2) 【连通块】

    一.题面 here 二.分析 这题刚开始没读懂题意,后来明白了,原来就是一个数连通块里点数的问题.首先在建图的时候,只考虑红色路径上的点.为什么呢,因为为了不走红色的快,那么我们可以反着想只走红色的路 ...

  6. little w and Soda(思维题)

    链接:https://ac.nowcoder.com/acm/contest/297/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  7. JZOJ 3453【NOIP2013中秋节模拟】连通块

    原题 Description 你应该知道无向图的连通块的数量,你应该知道如何求连通块的数量.当你兴奋与你的成就时,破坏王Alice拆掉了图中的边.当她发现,每删去一条边,你都会记下边的编号,同时告诉她 ...

  8. HDU - 1547 Bubble Shooter(dfs+连通块+模拟)

    题目链接:点击查看 题目大意:模拟泡泡枪游戏,问当击破指定位置的泡泡时,能有多少个泡泡同时爆炸? 题目分析:一个中规中矩的连通块问题,只不过在向四周扩散的时候需要注意的是,奇数行和偶数行的方向有点不一 ...

  9. 【BZOJ 1098】办公楼(补图连通块个数,Bfs)

    补图连通块个数这大概是一个套路吧,我之前没有见到过,想了好久都没有想出来QaQ 事实上这个做法本身就是一个朴素算法,但进行巧妙的实现,就可以分析出它的上界不会超过 $O(n + m)$. 接下来介绍一 ...

最新文章

  1. 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)
  2. SpringBoot+Shiro学习(八):RememberMe
  3. 根据需要通过代码的方式加载js文件
  4. 忘记redhat linux root密码怎么办
  5. python利用thinker制作多页面切换的桌面应用实例教程
  6. 手把手教你用itchat统计好友信息,了解一下?
  7. STM32(五)------GPIO位带操作
  8. c++ 使用正则匹配url
  9. 别让小小的“短信验证码”毁了用户体验
  10. (16)python_random学习笔记
  11. freemarker导出word如何换行
  12. 自然语言处理系列五》新词发现与短语提取》短语提取
  13. emmc5.1, ufs2.0, ufs3.0
  14. 文件名依照字符串和数字进行排序
  15. golang 数组组合成最小的整数_整数数组拼成一个最小或最大的数
  16. 从Github下载laravel项目遇到的坑
  17. ACM进阶计划(来自于南阳理工学院)
  18. Maven命令行窗口指定settings.xml
  19. 【C基础】(1ul<<5)|(1ul<<4)|(1ul<<2)
  20. 上拉与下拉加载判断是否联网

热门文章

  1. Python入门数学类编程——编写数学计算程序
  2. iPhone,iPad或Mac上的“丢失模式”是什么?
  3. 多触点电器自动测试系统
  4. 网络安全之认识勒索病毒
  5. html数字相关符号
  6. Ubuntu 安装git及git命令
  7. 【技术干货】如何评价一款App的稳定性和质量?
  8. 推荐国内外几大知名域名交易平台
  9. 微信小程序生成二维码之传参(接收的参数乱码该咋解决)
  10. 5G未来已来,云桌面的发展超乎想象!