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;
}