Codeforces 844C Sorting by Subsequences【思维】
来源:互联网 发布:dns默认端口 编辑:程序博客网 时间:2024/06/11 23:52
You are given a sequence a1, a2, ..., an consisting ofdifferent integers. It is required to split this sequence into themaximum number of subsequences such that after sorting integers in each of them in increasing order, the total sequence also will be sorted in increasing order.
Sorting integers in a subsequence is a process such that the numbers included in a subsequence are ordered in increasing order, and the numbers which are not included in a subsequence don't change their places.
Every element of the sequence must appear in exactly one subsequence.
The first line of input data contains integer n (1 ≤ n ≤ 105) — the length of the sequence.
The second line of input data contains n different integersa1, a2, ..., an ( - 109 ≤ ai ≤ 109) — the elements of the sequence. It is guaranteed that all elements of the sequence are distinct.
In the first line print the maximum number of subsequences k, which the original sequence can be split into while fulfilling the requirements.
In the next k lines print the description of subsequences in the following format: the number of elements in subsequenceci (0 < ci ≤ n), thenci integersl1, l2, ..., lci (1 ≤ lj ≤ n) — indices of these elements in the original sequence.
Indices could be printed in any order. Every index from 1 to n must appear in output exactly once.
If there are several possible answers, print any of them.
63 2 1 6 5 4
42 1 31 22 4 61 5
683 -75 -49 11 37 62
16 1 2 3 4 5 6
In the first sample output:
After sorting the first subsequence we will get sequence 1 2 3 6 5 4.
Sorting the second subsequence changes nothing.
After sorting the third subsequence we will get sequence 1 2 3 4 5 6.
Sorting the last subsequence changes nothing.
题目大意:
给出长度为N的一个序列,我们的任务是将其分割成尽可能多的子序列,使得每个子序列自身排序之后,最终的序列是一个递增的序列。
保证每个数只会出现一次。
思路:
首先我们对序列离散化。然后将会得到一个从1~N的一个排列。仔细分析一下不难想到,我们的任务其实就是在找环,对i和a【i】建边,我们只有当一个环内所有元素都分到一个子序列中才行。
Ac代码:
#include<stdio.h>#include<string.h>#include<algorithm>#include<map>#include<math.h>#include<vector>using namespace std;int n;int maxn[250000][21];vector<int>ans[150000];int b[150000];int c[150000];int a[150000];int vis[150000];void Lisanhua(){ int cnt=1; map<int,int>s; for(int i=1; i<=n; i++)scanf("%d",&b[i]),c[i]=b[i]; sort(c+1,c+1+n); for(int i=1; i<=n; i++) { if(s[c[i]]==0)s[c[i]]=cnt++; } for(int i=1; i<=n; i++) { a[i]=s[b[i]]; }}int main(){ while(~scanf("%d",&n)) { int cnt=0; Lisanhua(); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++)ans[i].clear(); for(int i=1;i<=n;i++) { if(vis[i]==0) { int x=i; while(vis[a[x]]==0) { vis[a[x]]=1; ans[cnt].push_back(a[x]); x=a[x]; } cnt++; } } printf("%d\n",cnt); for(int i=0;i<cnt;i++) { printf("%d ",ans[i].size()); for(int j=0;j<ans[i].size();j++) { printf("%d ",ans[i][j]); } printf("\n"); } }}
- Codeforces 844C Sorting by Subsequences【思维】
- Codeforces 844 C Sorting by Subsequences(离散+dfs+排序)
- CodeForces Sorting by Subsequences
- Codeforces AIM Tech Round 4 (Div. 2) C Sorting by Subsequences (dfs)
- AIM Tech Round 4 (Div. 2) C. Sorting by Subsequences
- Codeforces 606 C Sorting Railway Cars【思维】
- CF C. Sorting by Subsequences AIM Tech Round 4 (Div. 2)(简单模拟)
- 【codeforces】C - Buggy Sorting
- CodeForces 246A. Buggy Sorting【思维】
- Codeforces 315E Sereja and Subsequences【思维+Dp】
- Codeforces 314C. Sereja and Subsequences
- 【Codeforces 597C】 Subsequences - DP 主席树
- Codeforces 597C Subsequences dp + 树状数组
- codeforces-597C-Subsequences【树状数组】
- Subsequences CodeForces - 597C 树状数组 + dp
- 【codeforces 723C】 + 思维
- codeforces C. Queue (思维)
- codeforces-750【C思维】
- 观察者模式Observer Pattern
- Bash Shell 的 嵌套的While带来的问题
- Namespaces (C++)
- linux命令便捷手册
- MVP&Retrofit&Rxjava&Gson的简单例子
- Codeforces 844C Sorting by Subsequences【思维】
- C语言之continue与break的异同
- VS项目属性的一些配置项的总结
- TensorFlow函数:tf.Session()和tf.Session().as_default()的区别
- Handler倒计时
- C++学习之路 day2
- C++计算逆序对
- 基于socket---简单聊天室的实现
- Different GCD Subarray Query HDU