加速cin和cout
一般情况下,cin和cout的速度会比scanf和printf的速度慢3倍左右。其实,cin和cout慢是有原因的。默认情况下,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销,如何禁用这个特性呢?只需一个语句std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了。取消同步之后,cin,cout的速度就变得和scanf,printf的速度差不多了,但是要注意注意的是两种输入输出方式不要混用。
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
return (0-0);
}
List的使用
定义
List是stl实现的双向链表,与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢。使用时需要添加头文件 < l i s t > <list> <list>
定义和初始化
list<int>lst1; //创建空list
list<int> lst2(5); //创建含有5个元素的list
list<int>lst3(3,2); //创建含有3个元素的list
list<int>lst4(lst2); //使用lst2初始化lst4
list<int>lst5(lst2.begin(),lst2.end()); //同lst4
常用函数
lst.begin() //返回指向第一个元素的迭代器
lst.end() //返回末尾的迭代器
lst.insert() //插入一个元素到list中
lst.erase() //删除一个元素
lst.clear() //删除所有元素
lst.empty() //如果list是空的则返回true
lst.size() //返回list中的元素个数
lst.pop_back() //删除最后一个元素
lst.pop_front() //删除第一个元素
lst.push_back() //在list的末尾添加一个元素
lst.push_front() //在list的头部添加一个元素
lst.assign() //给list赋值
lst.front() //返回第一个元素
lst.back() //返回最后一个元素
lst.get_allocator() //返回list的配置器
lst.max_size() //返回list能容纳的最大元素数量
lst.merge() //合并两个list
lst.rbegin() //返回指向第一个元素的逆向迭代器
lst.remove() //从list删除元素
lst.remove_if() //按指定条件删除元素
lst.rend() //指向list末尾的逆向迭代器
lst.resize() //改变list的大小
lst.reverse() //把list的元素倒转
lst.sort() //给list排序
lst.splice() //合并两个list
lst.swap() //交换两个list
lst.unique() //删除list中重复的元素
例题:LRU management
链接
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
template<class T>inline void MAX(T &x,T y){if(y>x)x=y;}
template<class T>inline void MIN(T &x,T y){if(y<x)x=y;}
template<class T>inline void rd(T &x){
x=0;char o,f=1;
while(o=getchar(),o<48)if(o==45)f=-f;
do x=(x<<3)+(x<<1)+(o^48);
while(o=getchar(),o>47);
x*=f;
}
int cas,n,m,op,k;
char str[15];
int main(){
#ifndef ONLINE_JUDGE
freopen("jiedai.in","r",stdin);
// freopen("jiedai.out","w",stdout);
#endif
cin>>cas;
while(cas--){
list<pair<string,int> >li;
map<string,list<pair<string,int> >::iterator>mp;
cin>>m>>n;
while(m--){
rd(op),scanf("%s",str),rd(k);
if(op){
if(mp.find(str)==mp.end())puts("Invalid");
else{
list<pair<string,int> >::iterator it=mp[str];
if(k==-1){
if(it==li.begin())puts("Invalid");
else printf("%d\n",(--it)->second);
}
else if(k==1){
if(++it==li.end())puts("Invalid");
else printf("%d\n",it->second);
}
else printf("%d\n",it->second);
}
}
else{
if(mp.find(str)!=mp.end()){
list<pair<string,int> >::iterator it=mp[str];
k=it->second,li.erase(it);
}
li.push_back(make_pair(str,k));
mp[str]=li.end(),--mp[str];
if((int)li.size()>n){
mp.erase(mp.find(li.begin()->first));
li.pop_front();
}
printf("%d\n",k);
}
}
}
return (0-0);
}