题目链接:https://vjudge.net/problem/HDU-5127
转自:https://www.cnblogs.com/ACMERY/p/4697023.html
题意:输入3个数t,x,y。t为0时,查询已经添加的数据,输出xp+yq的最大值。t为1时,添加一个数据,t为-1时,删除一个数据。
思路:纯爆,给了30s。但是用map超时了,看了一下别人的vector也超时了,用list可以过。问题在于stl的选取,题意要求频繁的查询插入删除操作,如果需要频繁的插入删除,则应该用list,如果要随机存储,应该用vector。
在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
#include <bits/stdc++.h>
using namespace std;
list <pair<long long,long long> >ls;
int main()
{
int n;
while(scanf("%d",&n))
{
if(!n)
break;
ls.clear();
for(int i=0; i<n; i++)
{
long long a,b,t;
scanf("%lld%lld%lld",&t,&a,&b);
if(t==1)
{
ls.push_back(make_pair(a,b));
}
else if(t==0)
{
long long ans=-9000000000000000000;
list<pair<long long,long long> >::iterator it;
for(it=ls.begin(); it!=ls.end(); ++it)
{
long long c=(*it).first,d=(*it).second;
ans=max(ans,c*a+d*b);
}
printf("%lld\n",ans);
}
else
{
pair<long long,long long >p=make_pair(a,b);
list<pair<long long,long long> >::iterator it;
for(it=ls.begin(); it!=ls.end(); ++it)
{
if(p==(*it))
{
ls.erase(it);
break;
}
}
}
}
}
return 0;
}