几道STL题目(FJUT - OJ STL训练1)

  • 这个OJ一直在做,一些专题题目都很好,从易至难,阶梯上升,很适合像我这样的蒟蒻 =7=
  • 这篇是关于其中一个专题训练的题解思路及代码   http://120.78.128.11/Contest.jsp?cid=486
  • 所有题面我就不贴了,各位自行去看,链接在上一行 =7=

一、求众数(Map标记+Set)

  • 其实数组维护也可以做,但既然是STL训练,就用STL的东西了
  • 用map标记数据和出现的次数,然后转入结构体存入map中
  • 为什么不直接用set<map<T,T> >的形式 是因为map只能对关键字排序,而我们需要排次数,所以存入set中先转存入结构体
  • 然后没啥坑点,结构体自己构造一个排序就行了,如何构造请看另一篇博文
  • 代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <sstream>
 6 #include <iomanip>
 7 #include <map>
 8 #include <stack>
 9 #include <deque>
10 #include <queue>
11 #include <vector>
12 #include <set>
13 #include <list>
14 #include <cstring>
15 #include <cctype>
16 #include <algorithm>
17 #include <iterator>
18 #include <cmath>
19 #include <bitset>
20 #include <ctime>
21 #include <fstream>
22 #include <limits.h>
23 #include <numeric>
24
25 using namespace std;
26
27 #define F first
28 #define S second
29 #define mian main
30 #define ture true
31
32 #define MAXN 1000000+5
33 #define MOD 1000000007
34 #define PI (acos(-1.0))
35 #define EPS 1e-6
36 #define MMT(s) memset(s, 0, sizeof s)
37 typedef unsigned long long ull;
38 typedef long long ll;
39 typedef double db;
40 typedef long double ldb;
41 typedef stringstream sstm;
42 const int INF = 0x3f3f3f3f;
43
44 struct node{
45     int sum,x;
46     bool operator <(const node &b)const{
47         if(sum == b.sum)
48             return x < b.x;
49         else
50             return sum > b.sum;
51     }
52 };
53
54 map<int,int >q;
55 set<node>p;
56 set<node>::iterator it;
57
58 int main(){
59     ios_base::sync_with_stdio(false);
60     cout.tie(0);
61     cin.tie(0);
62     int n,t,x,d,e;
63     while(~scanf("%d",&n)){
64         q.clear();
65         p.clear();
66         while(n--){
67             scanf("%d",&t);
68             if(t == 1){
69                 scanf("%d",&x);
70                 q[x]++;
71                 p.insert((node){q[x],x});
72             }
73             else{
74                 if(!p.empty()){
75                     e = p.begin()->sum;
76                     int flag = 0;
77                     for(it = p.begin(); it != p.end(); it++){
78                         if(it->sum == e){
79                             if(flag++)
80                                 printf(" ");
81                             printf("%d",it->x);
82                         }
83                         else
84                             break;
85                     }
86                     puts("");
87                 }
88             }
89
90         }
91     }
92 }

二、营业额统计(Set)

  • 这个题用Set中的lower_bound函数直接找就行了 =7=
  • 没啥讲的 代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <sstream>
 6 #include <iomanip>
 7 #include <map>
 8 #include <stack>
 9 #include <deque>
10 #include <queue>
11 #include <vector>
12 #include <set>
13 #include <list>
14 #include <cstring>
15 #include <cctype>
16 #include <algorithm>
17 #include <iterator>
18 #include <cmath>
19 #include <bitset>
20 #include <ctime>
21 #include <fstream>
22 #include <limits.h>
23 #include <numeric>
24
25 using namespace std;
26
27 #define F first
28 #define S second
29 #define mian main
30 #define ture true
31
32 #define MAXN 1000000+5
33 #define MOD 1000000007
34 #define PI (acos(-1.0))
35 #define EPS 1e-6
36 #define MMT(s) memset(s, 0, sizeof s)
37 typedef unsigned long long ull;
38 typedef long long ll;
39 typedef double db;
40 typedef long double ldb;
41 typedef stringstream sstm;
42 const int INF = 0x3f3f3f3f;
43
44 set<int>q;
45
46 int main(){
47     ios_base::sync_with_stdio(false);
48     cout.tie(0);
49     cin.tie(0);
50     int n;
51     while(~scanf("%d",&n)){
52         q.clear();
53         int x;
54         ll sum = 0;
55         while(n--){
56             scanf("%d",&x);
57             if(q.empty()){
58                 sum += x;
59                 q.insert(x);
60             }
61             else{
62                 set<int>::iterator l = --q.lower_bound(x);
63                 set<int>::iterator r = q.lower_bound(x);
64                 int temp = min(abs(*l - x),abs(*r - x));
65                 sum += temp;
66                 q.insert(x);
67             }
68         }
69         printf("%lld\n",sum);
70     }
71
72     return 0;
73 }

三、宠物收养所(Set)

  • 和上一题类似,Set::Lower_bound直接搞就行了
  • 代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <sstream>
 6 #include <iomanip>
 7 #include <map>
 8 #include <stack>
 9 #include <deque>
10 #include <queue>
11 #include <vector>
12 #include <set>
13 #include <list>
14 #include <cstring>
15 #include <cctype>
16 #include <algorithm>
17 #include <iterator>
18 #include <cmath>
19 #include <bitset>
20 #include <ctime>
21 #include <fstream>
22 #include <limits.h>
23 #include <numeric>
24
25 using namespace std;
26
27 #define F first
28 #define S second
29 #define mian main
30 #define ture true
31
32 #define MAXN 1000000+5
33 #define MOD 1000000007
34 #define PI (acos(-1.0))
35 #define EPS 1e-6
36 #define MMT(s) memset(s, 0, sizeof s)
37 typedef unsigned long long ull;
38 typedef long long ll;
39 typedef double db;
40 typedef long double ldb;
41 typedef stringstream sstm;
42 const int INF = 0x3f3f3f3f;
43
44 set<int>q;
45
46 int main(){
47     ios_base::sync_with_stdio(false);
48     cout.tie(0);
49     cin.tie(0);
50     int n;
51     while(~scanf("%d",&n)){
52         q.clear();
53         int t,x;
54         ll sum = 0;
55         while(n--){
56             scanf("%d%d",&t,&x);
57             if(t == 0){
58                 q.insert(x);
59             }
60             else{
61                 if(q.empty()){
62                     continue;
63                 }
64                 set<int>::iterator l = --q.lower_bound(x);
65                 set<int>::iterator r = q.lower_bound(x);
66                 if(r == q.begin()){
67                     sum += abs(*r - x);
68                     q.erase(r);
69                 }
70                 else{
71                     int ll = abs(*l - x);
72                     int rr = abs(*r - x);
73                     if(ll == rr){
74                         sum += ll;
75                         q.erase(l);
76                     }
77                     else if(ll < rr){
78                         sum += ll;
79                         q.erase(l);
80                     }
81                     else if(ll > rr){
82                         sum += rr;
83                         q.erase(r);
84                     }
85                 }
86             }
87         }
88         printf("%lld\n",sum);
89     }
90
91     return 0;
92 }

四、第二集 你说,你的女朋友就是你的电脑(Stack)

  • 无力吐槽标题以及题面 =7=
  • Stack模拟一下就行
  • 代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <sstream>
 6 #include <iomanip>
 7 #include <map>
 8 #include <stack>
 9 #include <deque>
10 #include <queue>
11 #include <vector>
12 #include <set>
13 #include <list>
14 #include <cstring>
15 #include <cctype>
16 #include <algorithm>
17 #include <iterator>
18 #include <cmath>
19 #include <bitset>
20 #include <ctime>
21 #include <fstream>
22 #include <limits.h>
23 #include <numeric>
24
25 using namespace std;
26
27 #define F first
28 #define S second
29 #define mian main
30 #define ture true
31
32 #define MAXN 1000000+5
33 #define MOD 1000000007
34 #define PI (acos(-1.0))
35 #define EPS 1e-6
36 #define MMT(s) memset(s, 0, sizeof s)
37 typedef unsigned long long ull;
38 typedef long long ll;
39 typedef double db;
40 typedef long double ldb;
41 typedef stringstream sstm;
42 const int INF = 0x3f3f3f3f;
43
44 char s[2000010];
45
46 int main(){
47     ios_base::sync_with_stdio(false);
48     cout.tie(0);
49     cin.tie(0);
50     while(~scanf("%s",s)){
51         stack<char>q;
52         char ch;
53         int flag = 1;
54         int len = strlen(s);
55         for(int i = 0; s[i] != ‘\0‘; i++){
56             ch = s[i];
57             if(ch == ‘(‘ || ch == ‘{‘ || ch == ‘[‘ || ch == ‘<‘){
58                 q.push(ch);
59             }
60             else{
61                 char tp;
62                 if(s[i] == ‘}‘)
63                     tp = ‘{‘;
64                 else if(s[i] == ‘>‘)
65                     tp = ‘<‘;
66                 else if(s[i] == ‘]‘)
67                     tp = ‘[‘;
68                 else if(s[i] == ‘)‘)
69                     tp = ‘(‘;
70                 if(!q.empty()){
71                     if(q.top() == tp)
72                         q.pop();
73                 }
74                 else{
75                     flag = 0;
76                     break;
77                 }
78             }
79         }
80         if(flag){
81             if(q.empty())
82                 puts("YES");
83             else
84                 puts("NO");
85         }
86         else{
87             puts("NO");
88         }
89     }
90
91     return 0;
92 }

五、Jokes(Map+Queue维护)

  • 用一个队列存记得的笑话,然后 map标记一下就行了
  • 不过注意的是她能记m天包括当前天,所以存以前的笑话应该是m-1天(开始没注意 =7=)
  • 代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <sstream>
 6 #include <iomanip>
 7 #include <map>
 8 #include <stack>
 9 #include <deque>
10 #include <queue>
11 #include <vector>
12 #include <set>
13 #include <list>
14 #include <cstring>
15 #include <cctype>
16 #include <algorithm>
17 #include <iterator>
18 #include <cmath>
19 #include <bitset>
20 #include <ctime>
21 #include <fstream>
22 #include <limits.h>
23 #include <numeric>
24
25 using namespace std;
26
27 #define F first
28 #define S second
29 #define mian main
30 #define ture true
31
32 #define MAXN 1000000+5
33 #define MOD 1000000007
34 #define PI (acos(-1.0))
35 #define EPS 1e-6
36 #define MMT(s) memset(s, 0, sizeof s)
37 typedef unsigned long long ull;
38 typedef long long ll;
39 typedef double db;
40 typedef long double ldb;
41 typedef stringstream sstm;
42 const int INF = 0x3f3f3f3f;
43
44 int main(){
45     ios_base::sync_with_stdio(false);
46     cout.tie(0);
47     cin.tie(0);
48     int n,m;
49     while(~scanf("%d%d",&n,&m)){
50         int tot = 0,flag = 0;
51         map<int,int>q;
52         queue<int>vis;
53         if(n <= m){
54             flag = 1;
55         }
56         for(int i = 0; i < n; i++){
57             int temp;
58             scanf("%d",&temp);
59             if(q[temp] == 0)
60                 q[temp] = 1,tot++;
61             if(vis.size() == m-1){
62                 q[vis.front()] = 0;
63                 vis.pop();
64             }
65             vis.push(temp);
66         }
67         printf("%d",tot);
68     }
69
70     return 0;
71 }

六、Log大侠(线段树+离线)

  • 据说好像是某年蓝桥杯的题 然后暴力能水60%数据 =7=
  • 离线加线段树 不过建树的时候把1标记为2 输出时候减去标记数量 不然1会影响更新操作
  • 至于线段树不会离线不懂得话 =7= 后面慢慢讲 这里只讲题解思路
  • 代码:

  1 #include <iostream>
  2 #include <string>
  3 #include <cstdio>
  4 #include <cstdlib>
  5 #include <sstream>
  6 #include <iomanip>
  7 #include <map>
  8 #include <stack>
  9 #include <deque>
 10 #include <queue>
 11 #include <vector>
 12 #include <set>
 13 #include <list>
 14 #include <cstring>
 15 #include <cctype>
 16 #include <algorithm>
 17 #include <iterator>
 18 #include <cmath>
 19 #include <bitset>
 20 #include <ctime>
 21 #include <fstream>
 22 #include <limits.h>
 23 #include <numeric>
 24
 25 using namespace std;
 26
 27 #define F first
 28 #define S second
 29 #define mian main
 30 #define ture true
 31
 32 #define MAXN 1000000+5
 33 #define MOD 1000000007
 34 #define PI (acos(-1.0))
 35 #define EPS 1e-6
 36 #define MMT(s) memset(s, 0, sizeof s)
 37 typedef unsigned long long ull;
 38 typedef long long ll;
 39 typedef double db;
 40 typedef long double ldb;
 41 typedef stringstream sstm;
 42 const int INF = 0x3f3f3f3f;
 43
 44 const int maxn = 100010;
 45 int num[100010];
 46 ll tree[maxn<<2];
 47 int n,m;
 48 int l,r;
 49 int cnt;
 50
 51 void build(int x,int l, int r){
 52     if (l == r){
 53         cin >> tree[x];
 54         if (tree[x] == 1){
 55             cnt++;
 56             tree[x] = 2;
 57         }
 58         return;
 59     }
 60
 61     int mid = (l+r)/2;
 62     build((x<<1),l,mid);
 63     build((x<<1)+1,mid+1,r);
 64     tree[x] = tree[(x<<1)]+tree[(x<<1)+1];
 65 }
 66
 67 void update(int x,int l,int r,int L,int R){
 68     if (tree[x] == (r-l+1)<<1){
 69         return ;
 70     }
 71     if (l == r){
 72         tree[x] = num[tree[x]];
 73         return;
 74     }
 75
 76     int mid = (l+r)/2;
 77     if (R <= mid)
 78         update((x<<1),l,mid,L,R);
 79     else if (L > mid)
 80         update((x<<1)+1,mid+1,r,L,R);
 81     else{
 82         update((x<<1),l,mid,L,mid);
 83         update((x<<1)+1,mid+1,r,mid+1,R);
 84     }
 85     tree[x] = tree[(x<<1)]+tree[(x<<1)+1];
 86 }
 87
 88 int main(){
 89     ios_base::sync_with_stdio(false);
 90     cout.tie(0);
 91     cin.tie(0);
 92     for(int i = 1; i <= maxn; i++)
 93         num[i] = (int)(log2(i) + 1);
 94     cin >> n >> m;
 95
 96     build(1,1,n);
 97     while(m--){
 98         cin >> l >> r;
 99         update(1,1,n,l,r);
100         cout << tree[1] - cnt << endl;
101     }
102     return 0;
103 }

七、哈利什么什么什么的

  • 这题没做
  • 题目太长了 写了一下 WA了  后面再想吧 =7=

八、LRU算法实现(Map维护+Set)

  • 这题没做出来
  • 我的思路是两个map标记数据 和 是否存在(因为数据可能为0),然后Set记录是否最近走过,提交上去无情wa了两发
  • 我看了大佬的代码,基本都是用三个Map标记。溜了溜了
  • 这里就贴一下大佬的AC代码吧:

 1 /**
 2 rid: 195317
 3 user: sandychn
 4 time: 2018-07-21 10:40:16
 5 result: Accepted
 6 */
 7
 8 #include <bits/stdc++.h>
 9 using namespace std;
10 typedef long long ll;
11
12 struct LRU {
13     map <int, ll> key_value;
14     map <int, int> time_key;
15     map <int, int> key_time;
16     LRU() {
17         clear();
18     }
19     ~LRU() {
20     }
21     void clear() {
22         key_value.clear();
23         time_key.clear();
24         key_time.clear();
25     }
26     void insert(int time, int key, ll value) {
27         key_value[key] = value;
28         time_key[time] = key;
29         key_time[key] = time;
30     }
31     ll get(int key) {
32         auto it = key_value.find(key);
33         if(it == key_value.end())
34             return -1;
35         return it->second;
36     }
37     void remove(int key) {
38         auto it_key_time = key_time.find(key);
39         if(it_key_time == key_time.end())
40             return;
41         int time = it_key_time->second;
42         key_time.erase(it_key_time);
43         key_value.erase(key);
44         time_key.erase(time);
45     }
46     void visit(int key, int time) {
47         auto it_key_time = key_time.find(key);
48         if(it_key_time == key_time.end())
49             return;
50         int old_time = it_key_time->second;
51         key_time[key] = time;
52         time_key.erase(old_time);
53         time_key[time] = key;
54     }
55     void pop() {
56         if(time_key.empty())
57             return;
58         int key = time_key.begin()->second;
59 //        printf("Element %d has been erased.\n", key);
60         key_time.erase(key);
61         key_value.erase(key);
62         time_key.erase(time_key.begin());
63     }
64 };
65 LRU lru;
66 int main() {
67 //    freopen("../in.txt", "r", stdin);
68     int n, time, k;
69     ll v;
70     char opt[10];
71     while(scanf("%d", &n) != EOF) {
72         lru.clear();
73         for(time = 1; time <= n; ++time) {
74             scanf("%s", opt);
75             if(opt[0] == ‘i‘) {
76                 scanf("%d %lld", &k, &v);
77                 lru.insert(time, k, v);
78             } else if(opt[0] == ‘p‘) {
79                 lru.pop();
80             } else {
81                 scanf("%d", &k);
82                 if(opt[0] == ‘g‘)
83                     printf("%lld\n", lru.get(k));
84                 else if(opt[0] == ‘v‘)
85                     lru.visit(k, time);
86                 else if(opt[0] == ‘r‘)
87                     lru.remove(k);
88             }
89         }
90     }
91     return 0;
92 }

九、Registration system

  • 进去一看英文题 不想做 ,
  • 看了下样例觉得不难,等下做了再写

十、统计难题(Map)

  • 我是直接用map把输入的每个字符串的前缀全部记录
  • 然后直接输出就行
  • 如果是每次都去匹配的话应该会TLE
  • 值得注意的是这个题的输入格式,中间仅仅换了一行(各位还没见过这种格式输入可以自己先想想)
  • 代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <sstream>
 6 #include <iomanip>
 7 #include <map>
 8 #include <stack>
 9 #include <deque>
10 #include <queue>
11 #include <vector>
12 #include <set>
13 #include <list>
14 #include <cstring>
15 #include <cctype>
16 #include <algorithm>
17 #include <iterator>
18 #include <cmath>
19 #include <bitset>
20 #include <ctime>
21 #include <fstream>
22 #include <limits.h>
23 #include <numeric>
24
25 using namespace std;
26
27 #define F first
28 #define S second
29 #define mian main
30 #define ture true
31
32 #define MAXN 1000000+5
33 #define MOD 1000000007
34 #define PI (acos(-1.0))
35 #define EPS 1e-6
36 #define MMT(s) memset(s, 0, sizeof s)
37 typedef unsigned long long ull;
38 typedef long long ll;
39 typedef double db;
40 typedef long double ldb;
41 typedef stringstream sstm;
42 const int INF = 0x3f3f3f3f;
43
44 map<string,int>cot;
45
46 int main(){
47     ios_base::sync_with_stdio(false);
48     cout.tie(0);
49     cin.tie(0);
50
51     char temp[20];
52     string s;
53     while(1){
54         getline(cin,s);
55         if(!s[0])
56             break;
57         MMT(temp);
58         for(int i = 0; i < s.size(); i++){
59             temp[i] = s[i];
60             cot[temp]++;
61         }
62     }
63     while(cin>>s){
64         printf("%d\n",cot[s]);
65     }
66
67     return 0;
68 }

十一、看病要排队(Priority_Queue)

  • 又是排队又是STL 肯定就是优先队列啦
  • 三个优先队列分别记录三个医生的病人,然后模拟即可
  • 代码:

  1 #include <iostream>
  2 #include <string>
  3 #include <cstdio>
  4 #include <cstdlib>
  5 #include <sstream>
  6 #include <iomanip>
  7 #include <map>
  8 #include <stack>
  9 #include <deque>
 10 #include <queue>
 11 #include <vector>
 12 #include <set>
 13 #include <list>
 14 #include <cstring>
 15 #include <cctype>
 16 #include <algorithm>
 17 #include <iterator>
 18 #include <cmath>
 19 #include <bitset>
 20 #include <ctime>
 21 #include <fstream>
 22 #include <limits.h>
 23 #include <numeric>
 24
 25 using namespace std;
 26
 27 #define F first
 28 #define S second
 29 #define mian main
 30 #define ture true
 31
 32 #define MAXN 1000000+5
 33 #define MOD 1000000007
 34 #define PI (acos(-1.0))
 35 #define EPS 1e-6
 36 #define MMT(s) memset(s, 0, sizeof s)
 37 typedef unsigned long long ull;
 38 typedef long long ll;
 39 typedef double db;
 40 typedef long double ldb;
 41 typedef stringstream sstm;
 42 const int INF = 0x3f3f3f3f;
 43
 44 struct node{
 45     int id;
 46     int cnt;
 47     node(int id,int cnt):id(id),cnt(cnt){}
 48     friend operator < (node a,node b){
 49         if(a.cnt == b.cnt){
 50             return a.id > b.id;
 51         }
 52         return a.cnt < b.cnt;
 53     }
 54 };
 55
 56 int main(){
 57     ios_base::sync_with_stdio(false);
 58     cout.tie(0);
 59     cin.tie(0);
 60     int n;
 61     while(cin>>n){
 62         priority_queue<node>j,k,l;
 63         int tot = 1;
 64         for(int i = 1; i <= n; i++){
 65             string s;
 66             int a,b;
 67             cin>>s;
 68             if(s[0] == ‘I‘){
 69                 cin>>a>>b;
 70                 node tp(tot++,b);
 71                 if(a == 1){
 72                     j.push(tp);
 73                 }
 74                 else if(a == 2){
 75                     k.push(tp);
 76                 }
 77                 else if(a == 3){
 78                     l.push(tp);
 79                 }
 80             }
 81             else if(s[0] == ‘O‘){
 82                 cin>>a;
 83                 if(a == 1){
 84                     if(j.empty()){
 85                         cout<<"EMPTY"<<endl;
 86                     }
 87                     else{
 88                         node tp = j.top();
 89                         j.pop();
 90                         cout<<tp.id<<endl;
 91                     }
 92                 }
 93                 else if(a == 2){
 94                     if(k.empty()){
 95                         cout<<"EMPTY"<<endl;
 96                     }
 97                     else{
 98                         node tp = k.top();
 99                         k.pop();
100                         cout<<tp.id<<endl;
101                     }
102                 }
103                 else if(a == 3){
104                     if(l.empty()){
105                         cout<<"EMPTY"<<endl;
106                     }
107                     else{
108                         node tp = l.top();
109                         l.pop();
110                         cout<<tp.id<<endl;
111                     }
112                 }
113
114             }
115         }
116     }
117     return 0;
118 }

十二、Stone

  • 同第九题,英文题,现在不想做,等下再做

十三、离散化(Set+Vector)

  • 字符串离散化,数据处理的基础题吧
  • 因为C++有字符串类型,直接用string就行了,因为它内置了比较函数
  • 然后我用的是Set去重,转入Vector中找位置就行了,(注意Set有无序性!)
  • 其实也可以在Vector中利用unique去重,都行啦。
  • 代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <sstream>
 6 #include <iomanip>
 7 #include <map>
 8 #include <stack>
 9 #include <deque>
10 #include <queue>
11 #include <vector>
12 #include <set>
13 #include <list>
14 #include <cstring>
15 #include <cctype>
16 #include <algorithm>
17 #include <iterator>
18 #include <cmath>
19 #include <bitset>
20 #include <ctime>
21 #include <fstream>
22 #include <limits.h>
23 #include <numeric>
24
25 using namespace std;
26
27 #define F first
28 #define S second
29 #define mian main
30 #define ture true
31
32 #define MAXN 1000000+5
33 #define MOD 1000000007
34 #define PI (acos(-1.0))
35 #define EPS 1e-6
36 #define MMT(s) memset(s, 0, sizeof s)
37 typedef unsigned long long ull;
38 typedef long long ll;
39 typedef double db;
40 typedef long double ldb;
41 typedef stringstream sstm;
42 const int INF = 0x3f3f3f3f;
43
44 set<string>s;
45 vector<string>p;
46 char a[10005][40];
47
48 int main(){
49     ios_base::sync_with_stdio(false);
50     cout.tie(0);
51     cin.tie(0);
52     int n;
53     while(~scanf("%d",&n)){
54         s.clear();
55         p.clear();
56         for(int i = 0; i < n; i++){
57             scanf("%s",&a[i]);
58             s.insert(a[i]);
59         }
60         p.assign(s.begin(),s.end());
61         for(int i = 0; i < n; i++){
62           printf("%d\n",lower_bound(p.begin(),p.end(),a[i]) - p.begin() + 1);
63         }
64     }
65     return 0;
66 }



大部分都是一些基础题,我猜他们开这个专题也是为了让大家熟悉STL中的东西。

还是很值得一做的。毕竟多做题总是有好处。

我做的时候有些题目TLE了,所以也不是说直接上去写个什么什么就AC了,还是很值得一做的,还有这个OJ有些题目会提交失败,各位可以搜题然后去原OJ提交。

别问我为啥做这个OJ,很多都有做,还有就是,这个OJ界面做的很好有木有,题目也很好啦。

原文地址:https://www.cnblogs.com/xenny/p/9370160.html

时间: 2024-10-24 19:31:14

几道STL题目(FJUT - OJ STL训练1)的相关文章

课堂练习之每天出30道四则运算题目

1 /* 2 需求:每天出30道四则运算题目给小学生做 3 */ 4 5 class Rand 6 { 7 public static void sop(Object obj) 8 { 9 System.out.println(obj); 10 } 11 public static void main(String[] args) 12 { 13 sop("小学生二年级课后作业,每天30道四则运算练习:"); 14 15 int count = 0; 16 17 for (int i=

分享两道笔试题目

前几天,给成都的某家公司投了个简历,给发了两道笔试题目,与大家分享一下.附上自己的解题过程,写得不好的地方,还请博友多多指教. 一 .  设计程序输出销售及收费清单 一个电商平台对在其平台之上销售的除了书籍.食品以及药物以外的商品收取 10% 的费用.而对于进口的商品则额外收取 5% 的附加费用.对于平台抽取的费用计算时,舍入的规则是:对于 n% 抽取率,价格为 p的商品, np/100 的值就近舍入到 0.05(如: 7.125 -> 7.15, 6.66 -> 6.70 ). 卖家卖出一些

程序实现自动生成30道四则运算题目

课堂上老师要求我们做这样一个题目,题目要求是自动生成30道四则运算题目,要求除整数加减乘除外,还有真分数加减乘除.刚开始听到这个题目一头雾水,有点复杂,但仔细拆分这个题目不难发现,这个题目可以简化成三个小问题,分别是随机数自动生成两个数,自动生成符号,还有输出结果.对于随机数自动生成两个数可以简化为随机数生成整数,随机数生成真分数,生成真分数可以简化到随机数生成分子和分母.对于自动生成符号,也可以简化为随机数生成1,2,3,4,分别代表+,—,*,/,输出结果可以用一个for循化,实现输出30道

【算法学习笔记】57. 前缀树 字典序优化技巧 STL学习 SJTU OJ 1366 前缀匹配

Description 给出一个总字符个数大小不超过1,000,000的字典(这个字典的单词顺序不为字典序)和不超过1000个长度不超过1000的前缀,输出字典中匹配该前缀,字典序为K_i的单词在字典中的位置. 所有单词都为小写字母. Input Format 第一行: 两个整数N,M,分别表示字典中的单词个数和需要查询的前缀数. 接下来N行:每行一个字符串,表示字典中的单词. 接下来M行,每行一个K_i, P_i, P_i表示查询的前缀,K_i表示满足这个前缀在字典序中的位置. Output

calc 多项式计算 (STL版和非STL版) -SilverN

计算(calc.cpp) [问题描述] 小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”求出的值就是密码.小明数学学得不好,还需你帮他的忙.(“/”用整数除法) [输入] 输入文件calc.in共1行,为一个算式. [输出] 输出文件calc.out共1行,就是密码. [输入样例]calc.in 1+(3+2)*(7^2+6*9)/(2) [输出样例]calc.out

STL源码剖析——STL函数对象

前言 在STL中,函数对象也是比较重要的,有时候可以限定STL算法的行为,例如在前面介绍的<STL算法剖析>中,每个算法基本上都提供了两个操作版本,其中就用一个版本允许用户指定函数对象,这样可以根据用户的需要对算法进行操作.函数对象是一种具有函数特质的对象,所以可以作为算法的参数.本文介绍的函数对象比较简单,是基于一元或者二元操作结构的算术类函数对象.关系运算类函数对象.逻辑运算类函数对象.在定义函数对象时,为了使其具有函数行为,则必须重载operator()操作符.本文源码出自SGI STL

STL源码剖析——STL算法之find查找算法

前言 由于在前文的<STL算法剖析>中,源码剖析非常多,不方便学习,也不方便以后复习,这里把这些算法进行归类,对他们单独的源码剖析进行讲解.本文介绍的STL算法中的find.search查找算法.在STL源码中有关算法的函数大部分在本文介绍,包含findand find_if.adjacent_find.search.search_n.lower_bound. upper_bound. equal_range.binary_search.find_first_of.find_end相关算法,下

STL源码剖析——STL算法之merge合并算法

前言 由于在前文的<STL算法剖析>中,源码剖析非常多,不方便学习,也不方便以后复习,这里把这些算法进行归类,对他们单独的源码剖析进行讲解.本文介绍的STL算法中的merge合并算法.源码中介绍了函数merge.inplace_merge.并对这些函数的源码进行详细的剖析,并适当给出使用例子,具体详见下面源码剖析. merge合并算法源码剖析 // merge, with and without an explicitly supplied comparison function. //将两个

STL源码剖析——STL算法之remove删除算法

前言 由于在前文的<STL算法剖析>中,源码剖析非常多,不方便学习,也不方便以后复习,这里把这些算法进行归类,对他们单独的源码剖析进行讲解.本文介绍的STL算法中的remove删除算法,源码中介绍了函数remove.remove_copy.remove_if.remove_copy_if.unique.unique_copy.并对这些函数的源码进行详细的剖析,并适当给出使用例子,具体详见下面源码剖析. remove移除算法源码剖析 // remove, remove_if, remove_co