Codeforces 844 C Sorting by Subsequences(离散+dfs+排序)

来源:互联网 发布:淘宝商城女装夏装 编辑:程序博客网 时间:2024/06/07 03:36

题目地址
题意:给你一个序列,这个是序列是乱序的,你需要把它给排序,你有k个桶,每个数放入桶以后就会自动排序,然后再把这些数按原来的位置按现在的顺序放入,使得这个序列变得有序。问最大的k为多少?
思路:对这些数排个序因为要构成一个个的集合,所以每个集合必然是成环的,所以dfs一下就好了。然后每次dfs的时候下一步就是找该点排完序以后的位置上的数字是哪个,直到遇到被访问过的数。

#include <iostream>#include <stdio.h>#include <cstring>#include <vector>#include <queue>#include <map>#include <algorithm>#define N 100010#define INF 0x3f3f3f3fusing namespace std;int a[N], b[N], vis[N];map<int, int> mapp;vector<int> v[N];void dfs(int id, int num) {    v[num].push_back(id);    vis[id] = true;    if (!vis[mapp[a[id]]]) {        dfs(mapp[a[id]], num);    }}int main() {    cin.sync_with_stdio(false);    int n;    while (cin >> n) {        for (int i = 1; i <= n; i++) {            cin >> a[i];            b[i] = a[i];            v[i].clear();        }        mapp.clear();        memset(vis, false, sizeof(vis));        sort(b + 1, b + 1 + n);        for (int i = 1; i <= n; i++) {            mapp[b[i]] = i;        }        int cnt = 0;        for (int i = 1; i <= n; i++) {            if (!vis[i]) {                dfs(i, cnt);                cnt++;            }        }        cout << cnt << endl;        for (int i = 0; i < cnt; i++) {            cout << v[i].size();            for (int j = 0; j < v[i].size(); j++) {                cout << " " << v[i][j];            }            cout << endl;        }    }    return 0;}
原创粉丝点击