题意:三个操作

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. JuQueen(线段树 lazy)

    JuQueen Time Limit: 5 Sec  Memory Limit: 512 MB Description Input Output Sample Input 10 10 5 state ...

  2. UDP:用户数据报协议

    UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报.这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数 ...

  3. PetaPoco入门(二)

    1. Petapoco基本用法 1.1. 创建示例工程 首先创建一个工程文件,为了便于展示数据这里创建一个类型为:WindowsApplication的工程文件.命名为:PetapocoTest. 程 ...

  4. 如何使用R语言解决可恶的脏数据

    转自:http://shujuren.org/article/45.html 在数据分析过程中最头疼的应该是如何应付脏数据,脏数据的存在将会对后期的建模.挖掘等工作造成严重的错误,所以必须谨慎的处理那 ...

  5. USB port 如何识别不同的Charger类型

    基于Qualcom 8960/8921平台 一,软件分析 1.  USB charger types & Power supply types USB_INVALID_CHARGER      ...

  6. 特征的Attribute Only选项

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. 9----Lua中的面向对象

    什么是面向对象? 使用对象.类.继承.封装.消息等基本概念来进行程序设计 面向对象最重要的两个概念就是:对象和类 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位 一个对象由一组属性 ...

  8. linux命令:mkdir命令

    命令参数: -m, --mode=模式,设定权限<模式> (类似 chmod),而不是 rwxrwxrwx 减 umask -p, --parents  可以是一个路径名称.此时若路径中的 ...

  9. 32位和64位系统区别及int字节数

    理论上来讲 我觉得数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算). 常用数据类型对应字节数   可用如sizeof(char),sizeof(ch ...

  10. transition&transform,CSS中过度和变形的设置

    设置样式的过度效果transition-property: none/all; transition-duration:2s;运动时间,默认是0秒 transition-delay:0s; 延迟时间默 ...