题意:三个操作
1 a b : 队列中加入(x = a, y = b);
-1 a b : 队列中减去(x = a, y = b);
0 p q :从队列的数对中查询哪一对x,y能够让 p * x + q * y最大;
分析:因为一开始就觉得如果暴力绝对会超时,但是时限是30 000 ms,而且看见FB的又是8800ms过的,所以就暴力一次试试,但是TLE.
1 #include <iostream> 2 #include <cmath> 3 #include <vector> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <string> 8 #include <sstream> 9 #include <algorithm> 10 #define Max 2147483647 11 #define INF -0x7fffffff 12 #define N 910 13 #define ll long long 14 #define mem(a,b) memset(a,b,sizeof(a)) 15 #define repu(i, a, b) for(int i = (a); i < (b); i++) 16 const double PI=-acos(-1.0); 17 using namespace std; 18 vector<pair<ll,ll> > v; 19 int main() 20 { 21 ll a,b,c; 22 int n; 23 while(scanf("%d",&n) && n) 24 { 25 v.clear(); 26 repu(i,0,n) 27 { 28 scanf("%I64d%I64d%I64d",&a,&b,&c); 29 vector<pair<ll,ll> > ::iterator it; 30 if(a == 1) 31 v.push_back(pair<ll,ll>(b,c)); 32 else if(a == -1) 33 { 34 pair<ll,ll> t = pair<ll,ll>(b,c); 35 for(it = v.begin(); it!=v.end(); it++) 36 { 37 if(*it == t) 38 { 39 v.erase(it); 40 break; 41 } 42 } 43 } 44 else 45 { 46 ll maxn = 0; 47 int flag = 1; 48 for(it = v.begin(); it!=v.end(); it++) 49 { 50 if(flag) 51 maxn = it->first * b + it->second * c,flag = 0; 52 else 53 maxn = max(it->first * b + it->second * c,maxn); 54 } 55 printf("%I64d\n",maxn); 56 } 57 } 58 } 59 return 0; 60 }