【CF1638C】Inversion Graph(连通块,思维题)
【题目描述】
现在有一个序列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(连通块,思维题)相关推荐
- 树形dp ---- gym101655 D - Delta Quadrant 树上连通块思维换根 + 树形dp
题目链接 题目大意: 给你一颗NNN个节点的树,树上每条边有边权就是遍历的时间,你可以从任意节点出发遍历N−kN-kN−k个点并且回到出发点,问你最短的时间是多少? k∈[0,min(N,20)],N ...
- [C] [编程题]连通块(DFS解决)
时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 256M,其他语言512M 来源:牛客网 金山办公2020校招服务端开发工程师笔试题(一) 题目描述 给一个01矩阵,1代表是陆地,0代表 ...
- 挑战 渣打科营“Mini Code Marathon”赛题:连通块最少
package csdn; /** * 渣打科营"Mini Code Marathon"赛题:连通块最少 * @author Cheeps * 思路:在同一个全1连通块中,任何两个 ...
- CF1139C Edgy TreesDFS求连通块大小、思维
题目 题目链接 给一颗树,每条边都是红或黑的.问有多少种大小为kkk的序列[a1,a2...,ak][a_1,a_2...,a_k][a1,a2...,ak]满足,从a1a_1a1到a2a_2 ...
- C. Edgy Trees Codeforces Round #548 (Div. 2) 【连通块】
一.题面 here 二.分析 这题刚开始没读懂题意,后来明白了,原来就是一个数连通块里点数的问题.首先在建图的时候,只考虑红色路径上的点.为什么呢,因为为了不走红色的快,那么我们可以反着想只走红色的路 ...
- little w and Soda(思维题)
链接:https://ac.nowcoder.com/acm/contest/297/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- JZOJ 3453【NOIP2013中秋节模拟】连通块
原题 Description 你应该知道无向图的连通块的数量,你应该知道如何求连通块的数量.当你兴奋与你的成就时,破坏王Alice拆掉了图中的边.当她发现,每删去一条边,你都会记下边的编号,同时告诉她 ...
- HDU - 1547 Bubble Shooter(dfs+连通块+模拟)
题目链接:点击查看 题目大意:模拟泡泡枪游戏,问当击破指定位置的泡泡时,能有多少个泡泡同时爆炸? 题目分析:一个中规中矩的连通块问题,只不过在向四周扩散的时候需要注意的是,奇数行和偶数行的方向有点不一 ...
- 【BZOJ 1098】办公楼(补图连通块个数,Bfs)
补图连通块个数这大概是一个套路吧,我之前没有见到过,想了好久都没有想出来QaQ 事实上这个做法本身就是一个朴素算法,但进行巧妙的实现,就可以分析出它的上界不会超过 $O(n + m)$. 接下来介绍一 ...
最新文章
- 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)
- SpringBoot+Shiro学习(八):RememberMe
- 根据需要通过代码的方式加载js文件
- 忘记redhat linux root密码怎么办
- python利用thinker制作多页面切换的桌面应用实例教程
- 手把手教你用itchat统计好友信息,了解一下?
- STM32(五)------GPIO位带操作
- c++ 使用正则匹配url
- 别让小小的“短信验证码”毁了用户体验
- (16)python_random学习笔记
- freemarker导出word如何换行
- 自然语言处理系列五》新词发现与短语提取》短语提取
- emmc5.1, ufs2.0, ufs3.0
- 文件名依照字符串和数字进行排序
- golang 数组组合成最小的整数_整数数组拼成一个最小或最大的数
- 从Github下载laravel项目遇到的坑
- ACM进阶计划(来自于南阳理工学院)
- Maven命令行窗口指定settings.xml
- 【C基础】(1ul<<5)|(1ul<<4)|(1ul<<2)
- 上拉与下拉加载判断是否联网