模拟赛代码,本地AC,测评CE
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
int n,m,b[100005],wowo_paimin,a[100005];
string wowo;
struct paimin
{
int id,zidian;
mutable int fen;
const operator<(const paimin &o)const
{
if(fen!=o.fen)return fen<o.fen;
return id>o.id;
}
}paixu[100005];
map<string,int>mp;
map<string,int>zidi;
multiset<paimin>s;
multiset<paimin>fuben;
bool cmp(int a1,int a2)
{
return a1>a2;
}
string na[100005];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>na[i];
scanf("%d",&a[i]);
mp[na[i]]=i;
}
int bianhao=1;
for(auto it=mp.begin();it!=mp.end();it++)
{
s.insert({it->second,bianhao,a[it->second]});
zidi[na[it->second]]=bianhao;
bianhao++;
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i]);
}
sort(b+1,b+m+1,cmp);
cin>>wowo;
fuben=s;
auto it=s.lower_bound({mp[wowo],zidi[wowo],a[mp[wowo]]});
it->fen+=b[1];
it=s.begin();
for(int i=2;i<=m;i++)
{
if(it->id!=mp[wowo])
{
it->fen+=b[i];
}
else
{
i--;
}
it++;
}
it=s.begin();
for(int i=1;i<=n;i++)
{
paixu[i]=*it;
it++;
}
s.erase(s.begin(),s.end());
for(int i=1;i<=n;i++)
{
s.insert(paixu[i]);
}
wowo_paimin=1;
for(auto it=--s.end();;it--)
{
if(it->id==mp[wowo])break;
wowo_paimin++;
}
printf("%d ",wowo_paimin);
s=fuben;
if(m<n)
{
auto it=s.lower_bound({mp[wowo],zidi[wowo],a[mp[wowo]]});
int x=1;
for(auto it_xiao=s.begin();it_xiao!=it;it_xiao++)
{
if((it_xiao->fen+x>it->fen)||(it_xiao->fen+x==it->fen&&it_xiao->zidian<it->zidian))
{
it_xiao->fen+=b[x];
x++;
}
}
it=s.begin();
for(int i=1;i<=n;i++)
{
paixu[i]=*it;
it++;
}
s.erase(s.begin(),s.end());
for(int i=1;i<=n;i++)
{
s.insert(paixu[i]);
}
wowo_paimin=1;
for(auto it=--s.end();;it--)
{
if(it->id==mp[wowo])break;
wowo_paimin++;
}
printf("%d",wowo_paimin);
}
else
{
auto it=s.lower_bound({mp[wowo],zidi[wowo],a[mp[wowo]]});
int id=it->id,zidian=it->zidian,fen=it->fen;
fen+=b[m];
s.erase(it);
s.insert({id,zidian,fen});
it=s.lower_bound({mp[wowo],zidi[wowo],a[mp[wowo]]+b[m]});
int x=1;
for(auto it_xiao=s.begin();it_xiao!=it;it_xiao++)
{
if((it_xiao->fen+x>it->fen)||(it_xiao->fen+x==it->fen&&it_xiao->zidian<it->zidian))
{
it_xiao->fen+=b[x];
x++;
}
}
it=s.begin();
for(int i=1;i<=n;i++)
{
paixu[i]=*it;
it++;
}
s.erase(s.begin(),s.end());
for(int i=1;i<=n;i++)
{
s.insert(paixu[i]);
}
wowo_paimin=1;
for(auto it=--s.end();;it--)
{
if(it->id==mp[wowo])break;
wowo_paimin++;
}
printf("%d",wowo_paimin);
}
return 0;
}
/*
3
teama 10
teamb 20
teamc 40
2
10 20
teama
2
teama 10
teamb 10
2
10 10
teamb
*/