码迷,mamicode.com
首页 > 其他好文 > 详细

3.1 基础数据结构回顾

时间:2016-08-08 22:44:13      阅读:305      评论:0      收藏:0      [点我收藏+]

标签:

例题1  uva11995  http://acm.hust.edu.cn/vjudge/problem/18700

 

猜测符合哪种数据结构 , 用stl模拟判断.

 

技术分享
 1 //#define txtout
 2 //#define debug
 3 #include<bits/stdc++.h>
 4 #define mt(a,b) memset(a,b,sizeof(a))
 5 using namespace std;
 6 typedef long long LL;
 7 const double pi=acos(-1.0);
 8 const double eps=1e-8;
 9 const int inf=0x3f3f3f3f;
10 const int M=1e5+10;
11 int n;
12 int a[M];
13 int b[M];
14 char answer[8][32]={"stack","queue","priority queue","impossible","not sure"};
15 stack<int> s;
16 queue<int> q;
17 priority_queue<int> p;
18 bool checkStack(){
19     while(!s.empty()) s.pop();
20     for(int i=0;i<n;i++){
21         if(a[i]==1){
22             s.push(b[i]);
23             continue;
24         }
25         if(s.empty()) return false;
26         if(s.top()!=b[i]) return false;
27         s.pop();
28     }
29     return true;
30 }
31 bool checkQueue(){
32     while(!q.empty()) q.pop();
33     for(int i=0;i<n;i++){
34         if(a[i]==1){
35             q.push(b[i]);
36             continue;
37         }
38         if(q.empty()) return false;
39         if(q.front()!=b[i]) return false;
40         q.pop();
41     }
42     return true;
43 }
44 bool checkPriority(){
45     while(!p.empty()) p.pop();
46     for(int i=0;i<n;i++){
47         if(a[i]==1){
48             p.push(b[i]);
49             continue;
50         }
51         if(p.empty()) return false;
52         if(p.top()!=b[i]) return false;
53         p.pop();
54     }
55     return true;
56 }
57 int solve(){
58     bool isStack=checkStack();
59     bool isQueue=checkQueue();
60     bool isPriority=checkPriority();
61     if(isStack&&!isQueue&&!isPriority) return 0;
62     if(!isStack&&isQueue&&!isPriority) return 1;
63     if(!isStack&&!isQueue&&isPriority) return 2;
64     if(!isStack&&!isQueue&&!isPriority) return 3;
65     return 4;
66 }
67 int main(){
68     #ifdef txtout
69     freopen("in.txt","r",stdin);
70     freopen("out.txt","w",stdout);
71     #endif // txtout
72     while(~scanf("%d",&n)){
73         for(int i=0;i<n;i++){
74             scanf("%d%d",&a[i],&b[i]);
75         }
76         puts(answer[solve()]);
77     }
78     return 0;
79 }
View Code

 

 

例题2  uva 11991 http://acm.hust.edu.cn/vjudge/problem/18696

 

n个正整数, m 次查询 都是10^5,  每次查询第k 个 值为v的下标.  开10的6次方vector,每个值的下表到对应vector,  o1查询. on预处理

 

技术分享
 1 //#define txtout
 2 //#define debug
 3 #include<bits/stdc++.h>
 4 #define mt(a,b) memset(a,b,sizeof(a))
 5 using namespace std;
 6 typedef long long LL;
 7 const double pi=acos(-1.0);
 8 const double eps=1e-8;
 9 const int inf=0x3f3f3f3f;
10 const int M=1e5+10;
11 int n,m;
12 int a[M];
13 int k[M];
14 int v[M];
15 int answer[M];
16 vector<int> id[M*10];
17 void solve(){
18     for(int i=0;i<n;i++){
19         id[a[i]].clear();
20     }
21     for(int i=0;i<n;i++){
22         id[a[i]].push_back(i+1);
23     }
24     for(int i=0;i<m;i++){
25         int value=v[i];
26         if(id[value].size()<k[i]){
27             answer[i]=0;
28         }
29         else{
30             answer[i]=id[value][k[i]-1];
31         }
32     }
33 }
34 int main(){
35     #ifdef txtout
36     freopen("in.txt","r",stdin);
37     freopen("out.txt","w",stdout);
38     #endif // txtout
39     while(~scanf("%d%d",&n,&m)){
40         for(int i=0;i<n;i++){
41             scanf("%d",&a[i]);
42         }
43         for(int i=0;i<m;i++){
44             scanf("%d%d",&k[i],&v[i]);
45         }
46         solve();
47         for(int i=0;i<m;i++){
48             printf("%d\n",answer[i]);
49         }
50     }
51     return 0;
52 }
View Code

 

 

 白书用 map <int, vector<int> > ,也是一种写法 nlogn

 

技术分享
 1 //#define txtout
 2 //#define debug
 3 #include<bits/stdc++.h>
 4 #define mt(a,b) memset(a,b,sizeof(a))
 5 using namespace std;
 6 typedef long long LL;
 7 const double pi=acos(-1.0);
 8 const double eps=1e-8;
 9 const int inf=0x3f3f3f3f;
10 const int M=1e5+10;
11 int n,m;
12 map<int, vector<int> > a;
13 int main(){
14     #ifdef txtout
15     freopen("in.txt","r",stdin);
16     freopen("out.txt","w",stdout);
17     #endif // txtout
18     while(~scanf("%d%d",&n,&m)){
19         a.clear();
20         int x,y;
21         for(int i=0;i<n;i++){
22             scanf("%d",&x);
23             if(!a.count(x)) a[x]=vector<int>();
24             a[x].push_back(i+1);
25         }
26         for(int i=0;i<m;i++){
27             scanf("%d%d",&x,&y);
28             if(!a.count(y)||a[y].size()<x){
29                 puts("0");
30                 continue;
31             }
32             printf("%d\n",a[y][x-1]);
33         }
34     }
35     return 0;
36 }
View Code

 

 

例题3 la3135 http://acm.hust.edu.cn/vjudge/problem/18684

 

输入 A B,  表示每B秒产生A编号,  输出前k个编号, 同时产生的优先选编号小的。

 

优先队列,规则时间小的靠前,时间相同编号小的考前。优先队列大的在堆顶。

 

技术分享
 1 //#define txtout
 2 //#define debug
 3 #include<bits/stdc++.h>
 4 #define mt(a,b) memset(a,b,sizeof(a))
 5 using namespace std;
 6 typedef long long LL;
 7 const double pi=acos(-1.0);
 8 const double eps=1e-8;
 9 const int inf=0x3f3f3f3f;
10 const int M=1e5+10;
11 int n;
12 char a[M];
13 struct Q{
14     int id,now,add;
15     bool operator <(const Q &b) const {
16         return now>b.now||(now==b.now&&id>b.id);
17     }
18 }now,pre;
19 priority_queue<Q> q;
20 int main(){
21     #ifdef txtout
22     freopen("in.txt","r",stdin);
23     freopen("out.txt","w",stdout);
24     #endif // txtout
25     while(!q.empty()) q.pop();
26     while(~scanf("%s",a)){
27         if(!strcmp(a,"#")){
28             scanf("%d",&n);
29             while(n--){
30                 pre=q.top();
31                 q.pop();
32                 printf("%d\n",pre.id);
33                 now.id=pre.id;
34                 now.add=pre.add;
35                 now.now=pre.now+pre.add;
36                 q.push(now);
37             }
38             while(!q.empty()) q.pop();
39             continue;
40         }
41         int id,t;
42         scanf("%d%d",&id,&t);
43         now.id=id;
44         now.now=now.add=t;
45         q.push(now);
46     }
47     return 0;
48 }
View Code

 

 

 

end

3.1 基础数据结构回顾

标签:

原文地址:http://www.cnblogs.com/gaolzzxin/p/5750977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!