模板 基础数据结构

//主要这些东西竟然都不会手打...

队列

 1 #include<cstdio>
 2 #include<iostream>
 3 #define MAXN 1<<20
 4 using namespace std;
 5 int n;
 6 struct queue{
 7     int l,r,q[MAXN];
 8     queue():l(1),r(0) {}
 9     inline void push(int x){q[++r]=x;}
10     inline void pop(){l++;}
11     inline int front(){return q[l];}
12     inline bool size(){return l<=r;}
13 };
14 int main(){
15     scanf("%d",&n);
16     for(int i=0;i<n;i++) q.push(i+1);
17     while(q.size()) {
18         printf("%d ",q.front());q.pop();q.push(q.front());q.pop();
19     }
20     return 0;
21 }
queue
 1 #include<cstdio>
 2 #include<iostream>
 3 #define MAXN 1<<20
 4 using namespace std;
 5 int n;
 6 struct queue{
 7     int l,r,q[MAXN];
 8     queue():l(1),r(0) {}
 9     inline void push(int x){q[(++r)|(MAXN-1)]=x;}
10     inline void pop(){l++;}
11     inline int front(){return q[l|(MAXN-1)];}
12     inline bool size(){return l<=r;}
13 };
14 /*struct queue{
15     int l,r,q[MAXN];
16     queue():l(1),r(0) {}
17     inline void push(int x){q[(++r)&(MAXN-1)]=x;}
18     inline void pop(){l++;}
19     inline int front(){return q[l&(MAXN-1)];}
20     inline bool size(){return l<=r;}
21 };*/
22 queue q;
23 int main(){
24     scanf("%d",&n);
25     for(int i=0;i<n;i++) q.push(i+1);
26     while(q.size()) {
27         printf("%d ",q.front());q.pop();q.push(q.front());q.pop();
28     }
29     return 0;
30 }
queue(位运算优化)

 

 1 #include<cstdio>
 2 #define MAXN 1<<20
 3 using namespace std;
 4 struct Tstack{
 5     const int MAXdata=10000;
 6     int top,data[MAXdata];
 7     Tstack() {top=0;}
 8     void push(int x){data[++top]=x;}
 9     void pop(){top--;}
10     int top(){return data[top];}
11     bool empty(){return top==0;}
12 };
13 int main(){
14     
15 } 
stack

 

边表

 1 #include<cstdio>
 2 #include<vector>
 3 using namespace std;
 4 const int MAXN=1<<20;
 5 vector <pair<int,int> >G[MAXN];
 6 inline void add(int u,int v,int w){
 7     G[u].push_back(make_pair(v,w));
 8     G[v].push_back(make_pair(u,w)); 
 9 }
10 int main(){
11     for(int i=0;i<G[i].size();i++){
12         int v=G[u][i].first;
13         int w=G[u][i].second;
14     }
15 }
vector(带权)
 1 #include<cstdio>
 2 #include<vector>
 3 #define MAXN 1<<20
 4 using namespace std;
 5 vector <int> linker[MAXN],v[MAXN];
 6 inline void addedge(int x,int y,int z){
 7     linker[x].push_back(y);
 8     v[x].push_back(z); 
 9 }
10 int main(){
11     for(int i=0;i<linker[x].size();i++){
12         //查询元素个数:size() 
13         //do something 
14     }
15 } 
16 // 稀疏图  
17 
18 vector
vector
 1 #include<cstdio>
 2 #define MAXN 1<<20
 3 using namespace std;
 4 struct edge{
 5     int to,next,v;
 6 }e[MAXN];
 7 //add edge 
 8 inline void insert(int u,int v,int w){
 9     cnt++;
10     e[cnt].to=v;
11     e[cnt].next=last[u];
12     last[u]=cnt;
13     e[cnt].v=w;
14 }
15 // 遍历  
16 int main(){
17     for(int i=last[now];i;i=e[i].next){
18         //do sth
19     }
20 }
21 // 稠密图  
链表

 

 1 #include<cstdio>
 2 #include<queue>
 3 #define MAXN 1000005
 4 using namespace std;
 5 int n;
 6 priority_queue<int,vector<int>,greater<int> >q;
 7 int main(){
 8     scanf("%d",&n);
 9     while(n--){
10         int time;scanf("%d",&time);
11         if(time==1) {int x;scanf("%d",&x);q.push(x);}
12         if(time==2) {int top;top=q.top();printf("%d\n",top);}
13         if(time==3) {q.pop();}
14     }
15     return 0;
16 }
priority_queue
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #define MAXN 100005
 6 using namespace std;
 7 int n,sum=0;
 8 struct heap{
 9     int t[MAXN];
10     void push(int x){
11         t[++sum]=x;
12         for(int i=sum,j=i>>1;j;i=j,j=i>>1){
13             if(t[j]>t[i]) swap(t[j],t[i]);
14         }
15     }
16     void pop(){
17         t[1]=t[sum--];
18         for(int i=1,j=i<<1;j<=sum;i=j,j=i<<1){
19             if(j+1<=sum&&t[j+1]<t[j]) j++;
20             if(t[i]<t[j]) break;
21             else swap(t[i],t[j]);
22         }
23     }
24 }q;
25 int main(){
26     scanf("%d",&n);
27     while(n--){
28         int time;scanf("%d",&time);
29         if(time==1) {int x;scanf("%d",&x);q.push(x);}
30         if(time==2) {int top;top=q.t[1];printf("%d\n",top);}
31         if(time==3) {q.pop();}
32     }
33     return 0;
34 }
head
 1 #include<stdio.h>
 2 #include<string.h>
 3 const int maxN=1000005;
 4 int swap(int &a,int &b){int c=a;a=b;b=c;}
 5 struct heap{
 6     int data[maxN],tail;
 7     heap(){tail=0;}
 8     inline int min(int a,int b){
 9         if(b>tail)return a;
10         return data[a]<data[b]?a:b;
11     }
12     void up(int x){
13         if(x==1)return;
14         if(data[x]<data[x>>1]){
15             swap(data[x],data[x>>1]);
16             up(x>>1);
17         }
18     }
19     void down(int x){
20         if(x<<1>tail)return;
21         int p=min(x<<1,(x<<1)+1);
22         if(data[p]<data[x]){
23             swap(data[p],data[x]);
24             down(p);
25         }
26     }
27     void push(int x){data[++tail]=x;up(tail);}
28     void pop(){swap(data[tail],data[1]);tail--;down(1);}
29     int top(){return data[1];}
30 }h;
31 int main(){
32     int n,a,b; scanf("%d",&n);
33     while(n--){
34         scanf("%d",&a);
35         if(a==1){
36             scanf("%d",&b);
37             h.push(b);
38         }
39         if(a==2){
40             printf("%d\n",h.top());
41         }
42         if(a==3){
43             h.pop();
44         }
45     }
46 }
OMG_link

 

posted @ 2017-10-19 23:59  drizzly  阅读(300)  评论(0编辑  收藏  举报