AIM Tech Round 4 (Div. 2) C

来源:互联网 发布:换手机登陆淘宝账号 编辑:程序博客网 时间:2024/05/17 06:44

题目链接:点击打开链接

题意即求出某序列的最多划分子集数,使得对这些子集进行排序后整个序列有序

不妨考虑排序前后的序列对比,因为每个数字只能进行一次排序,所以必然在排序完成后进入其排好序的位置

由此可以建立一幅有向图,排序好的坐标(index)指向原坐标,只需统计其中环的数目即可

AC代码如下(日常stl综合症

#include <iostream>#include <cstring>#include <algorithm>#include <set>#include <vector>using namespace std;struct sn{    int index, num;    sn(int a=0, int b=0):index(a),num(b) {}    bool operator<(const sn& o)    {        return num<o.num;    }};int main(){    int n;    sn* ss;    vector<int>* re;    while(cin>>n)    {        ss = new sn[n+1];        re = new vector<int> [n+1];        for(int i=1;i<=n;++i)        {            int temp;            cin>>temp;            ss[i] = sn(i, temp);        }        sort(ss+1,ss+1+n);        set<int> pre;        int cnt = 0;        for(int i=1;i<=n;++i)        {            if(pre.find(i)==pre.end())            {                cnt++;                while(pre.find(i)==pre.end())                {                    re[cnt].push_back(i);                    pre.insert(i);                    i = ss[i].index;                }            }        }        pre.clear();        cout<<cnt<<endl;        for(int i=1;i<=cnt;++i)        {            cout<<re[i].size()<<" ";            for(int j=0;j<re[i].size();++j)                cout<<re[i][j]<<" ";            cout<<endl;        }        delete []ss;    }    return 0;}


原创粉丝点击