题意:三个操作

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.

 #include <iostream>
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#include <algorithm>
#define Max 2147483647
#define INF -0x7fffffff
#define N 910
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define repu(i, a, b) for(int i = (a); i < (b); i++)
const double PI=-acos(-1.0);
using namespace std;
vector<pair<ll,ll> > v;
int main()
{
ll a,b,c;
int n;
while(scanf("%d",&n) && n)
{
v.clear();
repu(i,,n)
{
scanf("%I64d%I64d%I64d",&a,&b,&c);
vector<pair<ll,ll> > ::iterator it;
if(a == )
v.push_back(pair<ll,ll>(b,c));
else if(a == -)
{
pair<ll,ll> t = pair<ll,ll>(b,c);
for(it = v.begin(); it!=v.end(); it++)
{
if(*it == t)
{
v.erase(it);
break;
}
}
}
else
{
ll maxn = ;
int flag = ;
for(it = v.begin(); it!=v.end(); it++)
{
if(flag)
maxn = it->first * b + it->second * c,flag = ;
else
maxn = max(it->first * b + it->second * c,maxn);
}
printf("%I64d\n",maxn);
}
}
}
return ;
}

TLE代码

 #include <iostream>
#include <cmath>
#include <list>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#include <algorithm>
#define Max 2147483647
#define INF -0x7fffffff
#define N 910
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define repu(i, a, b) for(int i = (a); i < (b); i++)
const double PI=-acos(-1.0);
#define pii pair<ll,ll>
using namespace std;
list<pii > v;
int main()
{
ll a,b,c;
int n;
while(scanf("%d",&n) && n)
{
v.clear();
///list<pii> v 每次被定义一遍更费时间,还不如clear时间少
repu(i,,n)
{
scanf("%I64d%I64d%I64d",&a,&b,&c);
list<pii> ::iterator it;
if(a == )
v.push_front(pii(b,c));
else if(a == -)
{
pii t = pii(b,c);
for(it = v.begin(); it!=v.end(); it++)
{
if(*it == t)
{
v.erase(it);
///v.remove(*it);也会超时,题目卡的很严
break;
}
}
}
else
{
ll maxn = ;
int flag = ;
for(it = v.begin(); it!=v.end(); it++)
{
if(flag)
maxn = it->first * b + it->second * c,flag = ;
else
maxn = max(it->first * b + it->second * c,maxn);
}
printf("%I64d\n",maxn);
}
}
}
return ;
}

AC代码

AC代码也是看了某个大神的代码仅仅用Ctrl+r把TLE代码中的vector改成了list,就A了,但是时间有点慢,我也是醉了;

其实就是vector和list的区别(http://w57w57w57.blog.163.com/blog/static/9607473520094751136967/):

具体细节看链接,只写用法:

在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
  1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
  2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
  3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。

而这个题目,即使用vector也并不是随即随取,也得是从头到尾遍历,因此插入和删除的时间复杂度更重要一些,所以就选择了list。

list的时间复杂度:         insert-------O(1)             erase-------O(1)

vector的时间复杂度:      insert------O(log(n))        erase------O(log(n))

 感觉并不是正规解,只能说是讨了后台样例的便宜。。。

HDU5127 神坑题---vector 、 list 、 deque 的用法区别的更多相关文章

  1. C++ 顺序容器 vector list deque 之比较

    在C++标准库中定义了三种顺序容器类型:vector,list和deque.所谓顺序容器就是根据位置来存储和访问元素,元素的排列次序与元素的值无关,而是由元素添加到容器的次序决定的. vector的底 ...

  2. POJ 1064 Cable master(二分查找+精度)(神坑题)

    POJ 1064 Cable master 一开始把 int C(double x) 里面写成了  int C(int x) ,莫名奇妙竟然过了样例,交了以后直接就wa. 后来发现又把二分查找的判断条 ...

  3. vector,list,deque

    stl提供了三个最基本的容器:vector,list,deque. vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由 ...

  4. list、vector、deque互相拷贝

    #include <iostream> #include <stdlib.h> #include <string.h> #include <algorithm ...

  5. vector,deque,list的区别和使用

    vector: 表示一段连续的内存区域,每个元素被顺序存储在这段内存中,对vector的随机访问效率很高,但对非末尾元素的插入和删除则效率非常低. deque: 也表示N段连续的内存区域组成,但与ve ...

  6. STL容器 vector,list,deque 性能比较

    C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差 ...

  7. C++顺序容器vector、deque、list

    1.容器元素类型 C++中大多数数据类型能够作为容器的元素类型.容器元素类型必须满足一下两个条件:支持赋值和复制操作. 所以没有元素是引用类型的容器,同一时候IO对象和auto_ptr也不能作为容器的 ...

  8. 第十篇:顺序容器vector,deque,list的选用规则

    前言 常见的顺序容器主要有三种 - vector,deque,list.它们实现的功能相差不大,那么实际开发中该如何进行选择呢?本文将为你解答这个问题. 分析 由于这三种容器实现的数据结构原型不同(v ...

  9. C++——STL之vector, list, deque容器对比与常用函数

    STL 三种顺序容器的特性对比: vector 可变数组,内存空间是连续的,容量不会进行缩减.支持高效随机存取,即支持[]和at()操作.尾部插入删除效率高,其他位置插删效率较低: list 双向链表 ...

随机推荐

  1. C#单独启动进程的几种方式

    本文实例讲述了C#启动进程的几种常用方法.分享给大家供大家参考.具体如下: 1.启动子进程,不等待子进程结束 private void simpleRun_Click(object sender, S ...

  2. 什么是 HTML?

    前言 在 W3C(万维网联盟)官网里,有一套针对于初学者的 HTML 培训教程,为期四周.为了提升自己的翻译水平,同时帮助大家入门,我给大家翻译出来,以供参考. 1. 什么是 HTML HTML 是创 ...

  3. Fiddler—PC上实现手机的抓包

    PC上安装Fiddler之后,可以抓取各种浏览器的请求,通过一些设置可以获取iPhone.安卓手机.windows phone的请求.具体的工作原理我也不多说(哼,绝对不是因为我不懂XD),主要说下如 ...

  4. Giving Data Backup Option in Oracle Forms 6i

    Suppose you want to give the data backup option in Oracle Forms application to some client users, wh ...

  5. iOS - CocoaPods 第三方开源框架管理

    1.CocoaPods CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具.CocoaPods 的项目源码在 Github 上管理.该项目开始于 2011 年 8 月 12 日,在这 ...

  6. struts(二) ---中参数传值

    struts中参数传值的方式有 种: 第一种:直接通过属性来传值 第二种: 第三种:

  7. php注意事项

    1. 不要使用mysql_函数 这一天终于来了,从此你不仅仅"不应该"使用mysql_函数.PHP 7 已经把它们从核心中全部移除了,也就是说你需要迁移到好得多的mysqli_函数 ...

  8. 5 分钟上手 ECharts

    获取 ECharts 你可以通过以下几种方式获取 ECharts. 从官网下载界面选择你需要的版本下载,根据开发者功能和体积上的需求,我们提供了不同打包的下载,如果你在体积上没有要求,可以直接下载完整 ...

  9. jq知识总结

    jQuery   jQuery基本选择器: id选择器     $("#div1") class选择器   $(".div1") 元素选择器   $(" ...

  10. shopex最新版前台一处想不到的SQL注入漏洞

    shopex代码核心的地方都做了加密处理,找漏洞就需要一点想象空间了,比如这个SQL注入… 存在于用户注册(想不到的位置吧?)   /core/shop/controller/ctl.passport ...