ACM模板(6)vector的数据域拓展和提取、拓展排序、逆置换

ACM模板列表 https://blog.csdn.net/nameofcsdn/article/details/107235360

//拓展数据域,加上id

//提取pair数组的first

//提取pair数组的second

//给vector拓展,加上id并排序

//排序后数组中的每个数的原ID,输入8 5 6 7,输出1 2 3 0,也可以直接求逆置换

//每个数在排序后的数组中的ID,输入8 5 6 7,输出3 0 1 2

//2个vector中寻找和为s的对,返回结果的每一行都是[id1,id2]

//拓展数据域,加上id
template<typename T>
vector<pair<T,int>>expand(vector<T>v)
{
    vector<pair<T,int>>ans;
    ans.resize(v.size());
    for(int i=0;i<v.size();i++)ans[i].first=v[i],ans[i].second=i;
    return ans;
}
//提取pair数组的first
template<typename T1,typename T2>
vector<T1> fdraw(vector<pair<T1,T2>>v)
{
    vector<T1>ans(v.size());
    for(int i=0;i<v.size();i++)ans[i]=v[i].first;
    return ans;
}
//提取pair数组的second
template<typename T1,typename T2>
vector<T2> fdraw2(vector<pair<T1,T2>>v)
{
    vector<T2>ans(v.size());
    for(int i=0;i<v.size();i++)ans[i]=v[i].second;
    return ans;
}
//给vector拓展,加上id并排序
template<typename T>
bool cmp(T x,T y)
{
    return x<y;
}
template<typename T>
vector<pair<T,int>> sortWithId(vector<T>v)
{
    vector<pair<T,int>>ans=expand(v);
    sort(ans.begin(),ans.end(),[](pair<T,int>p1,pair<T,int>p2){return cmp(p1.first,p2.first);});
    return ans;      
}
//排序后数组中的每个数的原ID,输入8 5 6 7,输出1 2 3 0,也可以直接求逆置换
template<typename T>
vector<int> sortId(vector<T>v)
{
    return fdraw2(sortWithId(v));
}
//每个数在排序后的数组中的ID,输入8 5 6 7,输出3 0 1 2
template<typename T>
vector<int> sortId2(vector<T>v)
{
    return sortId(sortId(v));
}
//2个vector中寻找和为s的对,返回结果的每一行都是[id1,id2]
template<typename T>
vector<vector<int>> findSum(vector<T>v1,vector<T>v2,T s)
{
    vector<vector<int>>ans;
    int m=min((long long)(v1.size()*v2.size()),(long long)12345678);
    ans.reserve(m);
    vector<int>tmp(2);
    vector<int>v3=sortId(v2);
    sort(v2.begin(), v2.end(),cmp<T>);
    for(int i=0;i<v1.size();i++)
    {
        auto it1=lower_bound(v2.begin(), v2.end(), s-v1[i]);
        auto it2=upper_bound(v2.begin(), v2.end(), s-v1[i]);
        tmp[0]=i;
        for(auto j=it1;j<it2;j++)
        {
            tmp[1]=v3[j-v2.begin()];
            ans.push_back(tmp);
        }
    }
    return ans;
}

猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/107233804