list
可以高效的在任意地方删除和插入,都是常数时间
- 适用于插入和删除频繁,随机访问较少
- 双向链表
- 复杂度:O(1)
- erase 函数:使作为参数的迭代器失效,并返回指向该迭代器下一参数的迭代器。 注意下一个参数
#include <bits/stdc++.h>
using namespace std;
int main(){
int t,n;
cin>>t;
while(t--){
cin>>n;
int k=2;
list<int>mylist;
for(int i=1;i<=n;i++) mylist.push_back(i);
while(mylist.size()>3){
int num=1;
for(auto it=mylist.begin();it!=mylist.end();){
if(num++%k==0) it=mylist.erase(it);
else it++;
}
k==2?k=3:k=2;
}
for(auto it=mylist.begin();it!=mylist.end();it++)
it!=mylist.begin()?cout<<' '<<*it:cout<<*it;
cout<<endl;
}
return 0;
}
vector
- 适用于插入和删除少,随机访问频繁
queue
先进先出
queue&stack 用法 hdu 1702 ACboy needs your help again
priority_queue
优先级高的出队列。
- 队列和排序的完美结合
- 复杂度:O(nlgn)
- 结构体优先设置,需要重载运算符,
bool operator<(const node&b) const
.从数学意义上来说只需要重载小于运算符。这样内部就是数值大的优先级高 - 第3条的cmp函数与sort相反的作用。
#include <bits/stdc++.h>
using namespace std;
struct node{
int id,p;
bool operator<(const node&b) const{//两个数一样,不交换
if(p!=b.p) return p<b.p;
return id>b.id;//id的大小代表了时间顺序
}
};
int main(){
int n;
while(cin>>n){
priority_queue<node> res[4];
int cnt=0;
while(n--){
string s;
cin>>s;
if(s=="IN"){
int a,b;
cin>>a>>b;
res[a].push({++cnt,b});
}else if(s=="OUT"){
int a;
cin>>a;
if(res[a].size()==0) cout<<"EMPTY"<<endl;
else {
cout<<res[a].top().id<<endl;
res[a].pop();
}
}
}
}
return 0;
}
sort
- 复杂度:O(nlgn)
- 排列范围: [first,last)
- 自定义:less(), greater(), less_equal(), greater_equal(), 还有自定义的cmp
示例:
greater<int>()
map
- 复杂度:O(lgn)
用法 hdu 2648 Shopping
#include <bits/stdc++.h>
using namespace std;
map<string ,int> res;
int main(){
int m,n,d;
string s;
while(cin>>m){
for(int i=0;i<m;i++) cin>>s;
cin>>n;
for(int i=0;i<n;i++){
for(int i=0;i<m;i++){
cin>>d>>s;
res[s]+=d;
}
int rank=1;
for(auto it=res.begin();it!=res.end();it++)
if(it->second>res["memory"]) rank++;
cout<<rank<<endl;
}
res.clear();
}
return 0;
}
set
- 复杂度:O(lgn)
#include <bits/stdc++.h>
using namespace std;
set<string> all,lose;
int main(){
int n;
while(cin>>n&&n){
string a,b;
for(int i=0;i<n;i++){
cin>>a>>b;
all.insert(a);
all.insert(b);
lose.insert(b);
}
if(all.size()-lose.size()==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
all.clear();lose.clear();
}
return 0;
}
next_permutation
每执行一次,把新的排列放在原来的空间里。一般来说,初始序列(用sort)得到最小序列
- 返回值:bool 类型
- 复杂度:O(n)
- 排列范围:[first,last)
#include <bits/stdc++.h>
using namespace std;
int a[1010];
int main(){
int n,m;
while(cin>>n>>m){
for(int i=1;i<=n;i++)a[i]=i;
for(int i=1;i<m;i++) next_permutation(a+1,a+n+1);
for(int i=1;i<=n;i++) i-1==0?cout<<a[i]:cout<<' '<<a[i];
cout<<endl;
}
return 0;
}