3.1 基础数据结构回顾

例题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 }

例题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 }

白书用 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 }

例题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 }

end

时间: 2024-10-11 15:17:25

3.1 基础数据结构回顾的相关文章

JS基础知识回顾:引用类型(一)

在ECMAScript中引用类型是一种数据结构,用于将数据和功能组织在一起,而对象时引用类型的一个实例. 尽管ECMAScript从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构,所以虽然说引用类型与类看起来想死,但他们并不是相同的概念. 不过引用类型有的时候也可以被称为对象定义,因为他们描述的是一类对象所具有的属性和方法. 新对象是使用new操作符后跟一个构造函数来实现的,构造函数本身就是一个函数,只不过该函数时处于创建新对象的目的而定义的. ECMASc

Java基础知识回顾之七 ----- 总结篇

前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数据类型 基本数据类型主要有: byte.short.int.long.float.double.char.boolean 它们可以分为三类: 数值类型:byte.short.int.long.float.double 字符类型:char 布尔型:boolean 其中byte是8位,short是16位

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub

java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)

1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法,定义在Object基类中. wait()方法:对此对象调用wait方法导致本线程放弃对象锁,让线程处于冻结状态,进入等待线程的线程池当中.wait是指已经进入同步锁的线程,让自己暂时让出同步锁,以便使其他正在等待此锁的线程可以进入同步锁并运行,只有其它线程调用notify方

java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数封装的代码操作tickets,同步代码块中的锁我们可以指定.假设我们事先不知道同步函数用的是什么锁:如果在同步代码块中指定的某个锁(测试)和同步函数用的锁相同,就不会出现线程安全问题,如果锁不相同,就会发生线程安全问题. 看下面的代码:t1线程用的同步锁是obj,t2线程在操作同步函数的资源,假设不

java基础知识回顾之javaIO类--管道流PipedOutputStream和PipedIutputStream

管道流(线程通信流):管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把输出流连在输入流之上.如图所示: 1.管道输入流应该连接到管道输出流 ,输入流和输出流可以直接连接       2.使用多线程操作,结合线程进行操作.通常由某个线程从管道输入流中(PipedInputStream)对象读取.          并由其他线程将其写入到相应的端到输出流中.不能使用单线程

排序与基础数据结构

6大排序与6大基础数据结构 本文从冒泡排序撩起,对选择.插入.希尔.归并.快排6种经典的数组排序进行了深入分析,并详解其间的关联,让你深刻理解其中的关键点:同时对经典的数据结构Vector.Stack.Queue.树.Map.Set做了归纳总结,对其底层的实现做了解析,分享给大家,作为每一个中高级程序员应该懂得的算法与排序,祝大家早上走上自己的"成金之路". 目录: 1.排序算法 2.数据结构 3.资料参考 1.排序算法: a.起源: 计算机从诞生起,就在模拟人这种智能生物的行为,而排

java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在运行,锁加在哪一块代码 那么我们要思考的地方有:1.知道我们写的哪些是多线程代码 2.明确共享数据 3.明确多线程运行的代码中哪些语句是操作共享数据的.. 4.要确保使用同一个锁. 下面的代码:需求:两个存户分别往银行存钱,每次村100块,分三次存完. class bank{ private int

java基础知识回顾之---java String final类普通方法

辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      *      * 1,获取:     * 1.1 获取字符串中字符的个数(长度).     *         int length();     * 1.2 取字符串中的某一个字符,其中的参数index指的是字符串中序数.字符串的序数从0开始到length()-1 .     *