CodeForces Sorting by Subsequences
来源:互联网 发布:天干地支年算法 编辑:程序博客网 时间:2024/06/07 01:56
·英文题,述大意:
输入一个长度为n的无重复元素的序列{a1,a2……an}(1<=n<=105,|ai|<109,将其分成p个不重复的子序列,使得只对每个子序列升序排序,能够在各个子序列排完序后,整个序列也是升序排列好的。求p的最大值,将其输出后并按任意顺序每一行输出每个子序列长度和每个元素排序好的下标。
·分析:
对子序列排序,最终竟然可以使得整个序列都排好序,那么我们可以清晰地发现:每一个子序列排序一定可以将它含有的元素全部放到全序列排序后的对应位置。例如,对于序列{4,1,2,5},它的全序列排序排序结果为{1,2,4,5},那么对于一种可行解:分为子序列{4,1,2}和{5},我们对子序列{4,12}的排序必定要将他们三个元素还原到全序列排序后的位置。
输入一个长度为n的无重复元素的序列{a1,a2……an}(1<=n<=105,|ai|<109,将其分成p个不重复的子序列,使得只对每个子序列升序排序,能够在各个子序列排完序后,整个序列也是升序排列好的。求p的最大值,将其输出后并按任意顺序每一行输出每个子序列长度和每个元素排序好的下标。
·分析:
对子序列排序,最终竟然可以使得整个序列都排好序,那么我们可以清晰地发现:每一个子序列排序一定可以将它含有的元素全部放到全序列排序后的对应位置。例如,对于序列{4,1,2,5},它的全序列排序排序结果为{1,2,4,5},那么对于一种可行解:分为子序列{4,1,2}和{5},我们对子序列{4,12}的排序必定要将他们三个元素还原到全序列排序后的位置。
这样就存在一种依赖关系,将其归纳为结论就是:如果元素ai的下标i不等于全序列排序后它的下标j,那么元素ai,aj必定属于同一个划分的子序列。这样很好理解:对于一个ai,它排序后要前往j位置(而且i!=j),那么原本在j位置的数就要被挤出来另寻其他的位置,然后它又去占其他数的位置,直到这些数的占位置关系构成一个环,就可以将它们都安置了。然后我们就将上述操作的一些列元素归为一个子序列,由于这样做是保证最基本的各个元素排序能够到达正确位置,所以划分出来的子序列一定是最多的。
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5+5;typedef struct Node{int val,id,id2;}node;node a[maxn];#define next _nextint next[maxn];bool vis[maxn];bool cmp1(const node &x,const node &y){return x.val<y.val;}bool cmp2(const node &x,const node &y){return x.id<y.id;}int main(int argc, char const *argv[]){ios::sync_with_stdio(false);int n;while(cin>>n){for(int i=0;i<n;i++){cin>>a[i].val;a[i].id=i;}sort(a,a+n,cmp1);for(int i=0;i<n;i++){a[i].id2=i;next[i]=a[i].id;}sort(a,a+n,cmp2);vector<vector<int>>ans;memset(vis,0,sizeof(vis));for(int i=0;i<n;i++){vector<int>temp;if(!vis[i]){temp.push_back(i);int k=next[i];vis[i]=1;while(i!=k){vis[k]=1;temp.push_back(k);k=next[k];}}if(temp.size()) ans.push_back(temp);}cout<<ans.size()<<endl;for(int i=0;i<(int)ans.size();i++){vector<int>&e=ans[i];cout<<e.size();for(int j=0;j<(int)e.size();j++){cout<<" "<<e[j]+1;}cout<<endl;}}return 0;}
阅读全文
0 0
- CodeForces Sorting by Subsequences
- Codeforces 844C Sorting by Subsequences【思维】
- Codeforces 844 C Sorting by Subsequences(离散+dfs+排序)
- Codeforces AIM Tech Round 4 (Div. 2) C Sorting by Subsequences (dfs)
- AIM Tech Round 4 (Div. 2) C. Sorting by Subsequences
- CF C. Sorting by Subsequences AIM Tech Round 4 (Div. 2)(简单模拟)
- pku1674 Sorting by Swapping
- sorting map by value
- sorting by fields
- Sorting by Swapping
- permute by sorting
- Bogosort: Sorting by Exchanging
- Bozosort: Sorting by Exchanging
- Sorting by Swapping
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) D. Sorting the Coins 乱搞
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) D. Sorting the Coins
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) D. Sorting the Coins【规律】
- Internal Sorting: Heapsort-2:Sorting by Selection
- Android Studio基础技巧篇
- (五)懒加载模块
- Mac上Homebrew的使用 (Homebrew 使 OS X 更完整)
- Java环境配置
- Koa2 学习笔记(第五天)
- CodeForces Sorting by Subsequences
- Jquey Deferred 独立实现版本不依赖jquery
- (六)懒加载和依赖注入树
- 鼠标悬浮(一段时间)才处理
- HDU 6171 Admiral (DFS + 剪枝)
- 正则校验汇总(js)
- Beginning Spring学习笔记——第3章(二)表单处理
- 教你解决Eclipse中SVN比较乱码问题
- 使用eclipes中遇到的问题