Codeforces AIM Tech Round 4 (Div. 2) C Sorting by Subsequences (dfs)

来源:互联网 发布:阿里郎软件 编辑:程序博客网 时间:2024/06/17 06:28

也不算dfs吧,因为每一个数只能出现一次,所以他必要找到”下家”才行,也就是他该在的位置,那么这是一个连锁的反应.

/*  xzppp  */#include <iostream>#include <vector>#include <cstdio>#include <string.h>#include <algorithm>#include <queue>#include <map>#include <math.h>#include <string>using namespace std;#define FFF freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define MP make_pair#define PB push_backtypedef long long  LL;typedef unsigned long long ULL;const int MAXN = 1e5+17;const int MAXM = 20;const int INF = 0x7fffffff;const int MOD = 1e9+7;int a[MAXN],b[MAXN],vis[MAXN];map<int,int > mp;vector<int > ans[MAXN];void dfs(int plc,vector<int > & v){    //cout<<plc<<endl;    v.push_back(plc);    vis[plc]=1;    if(!vis[mp[a[plc]]])    dfs(mp[a[plc]],v);}int main(){    #ifndef ONLINE_JUDGE     FFF    #endif    int n;    cin>>n;    for (int i = 1; i <= n; ++i)    {        scanf("%d",&a[i]);        b[i] = a[i];    }    sort(b+1, b+n+1);    for (int i = 1; i <= n; ++i)    {        mp[b[i]] = i;    }    int x= 0;    for (int i = 1; i <= n; ++i)    {        if(!vis[i])        {            dfs(i,ans[x++]);        }    }    cout<<x<<endl;    for (int i = 0; i < x; ++i)    {        printf("%d ",ans[i].size() );        for (int j = 0; j < ans[i].size(); ++j)            {                printf("%d%c",ans[i][j],j==ans[i].size()-1?'\n':' ');            }    }    return 0;}
原创粉丝点击