离线操作将需要询问的a,b先读取下来,然后对于每一个数字我们开一个数组表示这个数字出现在第几个照片里面,然后对于a,b我们只要访问这个数组然后访问对应的照片数组就可以了。
#include <iostream>
#include <string>
#include <set>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
const int MAXN=1111;
map<int,int>mp1,mp2;
vector<int> vt[MAXN],vt1[MAXN];
set<int> ans1,ans2;
double map1[MAXN][MAXN];
string sex[MAXN];
int n,m;
int main()
{
cin>>n>>m;
memset(map1,0,sizeof(map1));
for(int i=0;i<m;i++)
{
int k;
cin>>k;
for(int j=0;j<k;j++)
{
string str;
int kk;
cin>>str;
if(str[0]=='-')
{
int ttt=0;
for(int z=1;z<str.size();z++)
ttt=ttt*10+str[z]-'0';
sex[ttt]="F";
vt[i].push_back(ttt);
vt1[ttt].push_back(i);
}
else
{
int ttt=0;
for(int z=0;z<str.size();z++)
ttt=ttt*10+str[z]-'0';
sex[ttt]="M";
vt[i].push_back(ttt);
vt1[ttt].push_back(i);
}
}
}
int x,y;
string aa,bb;
cin>>aa>>bb;
if(aa[0]=='-')
{
x=0;
for(int i=1;i<aa.size();i++)
x=x*10+aa[i]-'0';
sex[x]="F";
}
else
{
x=0;
for(int i=0;i<aa.size();i++)
x=x*10+aa[i]-'0';
sex[x]="M";
}
if(bb[0]=='-')
{
y=0;
for(int i=1;i<bb.size();i++)
y=y*10+bb[i]-'0';
sex[y]="F";
}
else
{
y=0;
for(int i=0;i<bb.size();i++)
y=y*10+bb[i]-'0';
sex[y]="M";
}
for(int i=0;i<vt1[x].size();i++)
{
int k=vt1[x][i];
double ans=(1.0)/(vt[k].size()*1.0);
for(int j=0;j<vt[k].size();j++)
{
map1[x][vt[k][j]]+=ans;
}
}
for(int i=0;i<vt1[y].size();i++)
{
int k=vt1[y][i];
double ans=(1.0)/(vt[k].size()*1.0);
for(int j=0;j<vt[k].size();j++)
{
map1[y][vt[k][j]]+=ans;
}
}
double max1,max2;
max1=-1;
max2=-1;
for(int i=0;i<n;i++)
{
if(sex[i]!=sex[x])
{
if(map1[x][i]>max1)
max1=map1[x][i];
}
}
for(int i=0;i<n;i++)
{
if(sex[i]!=sex[x]&&map1[x][i]==max1)
{
ans1.insert(i);
mp1[i]=1;
}
}
for(int i=0;i<n;i++)
{
if(sex[y]!=sex[i])
{
if(map1[y][i]>max2)
max2=map1[y][i];
}
}
for(int i=0;i<n;i++)
{
if(map1[y][i]==max2&&sex[y]!=sex[i])
{
ans2.insert(i);
mp2[i]=1;
}
}
if(mp1[y]==1&&mp2[x]==1)
{
if(sex[x]=="F")
{
printf("-%d %d\n",x,y);
}
else
printf("%d -%d\n",x,y);
}
else
{
for(auto it=ans1.begin();it!=ans1.end();it++)
{
if(sex[x]=="F")
printf("-%d ",x);
else
printf("%d ",x);
if(sex[*it]!=sex[x])
{
if(sex[*it]=="M") printf("%d\n",*it);
else printf("-%d\n",(*it));
}
}
for(auto it=ans2.begin();it!=ans2.end();it++)
{
if(sex[y]=="F")
printf("-%d ",y);
else
printf("%d ",y);
if(sex[*it]!=sex[y])
{
if(sex[*it]=="M") printf("%d\n",*it);
else printf("-%d\n",(*it));
}
}
}
return 0;
}