abc306

Toyota Programming Contest 2023#3(AtCoder Beginner Contest 306) - AtCoder

A:

把给定的字符串的每个字符都重复输出两次

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     std::ios::sync_with_stdio(false);
 6     cin.tie(0),cout.tie(0);
 7     int n;
 8     string s;
 9     cin>>n;
10     cin>>s;
11    for(auto i:s){
12     cout<<i<<i;
13 
14    }
15    cout<<'\n';
16     return 0;
17 
18 }

 

B:

样例

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef unsigned long long ull;
 4 
 5 int main()
 6 {
 7     std::ios::sync_with_stdio(false);
 8     cin.tie(0),cout.tie(0);
 9    
10    ull s1=0;
11    for(ull i=0;i<=63;i++){
12         ull x;
13         cin>>x;
14         s1 |= (x<<i);//左移i位,就是2的i次,按位或看成加法
15     
16    }
17    cout<<s1<<endl;
18     return 0;
19 
20 }

 

C:

 一个数字出现了3次就输出

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int mxn=3e5+5;
 4 
 5 int n;
 6 int a[mxn];
 7 int cnt[mxn];
 8 vector<int >ans;
 9 
10 int main()
11 {
12     std::ios::sync_with_stdio(false);
13     cin.tie(0),cout.tie(0);
14    
15    
16    cin>>n;
17    for(int i=1;i<=3*n;i++)cin>>a[i];
18    for(int i=1;i<=3*n;i++){
19     cnt[a[i]]++;
20     if(cnt[a[i]]==2)ans.emplace_back(a[i]);
21    }
22 
23    for(auto i:ans){
24     cout << i << ' ';
25    }
26    
27     return 0;
28 
29 }
View Code

 

D:

吃毒药和解药

毒药+解药=好了,毒药+毒药=die,毒药=upset health

 

可以吃或者跳过

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mxn=5e5+6;
 5 ll a[mxn];
 6 
 7 
 8  struct Node{
 9     ll idx,val;
10     bool operator < (const Node &u)const{
11         return val == u.val ? idx < u.idx : val < u.val;//降序排列
12     }
13  };
14 
15 set<Node>stMax,stMin;
16 
17  int main()
18  {
19     std::ios::sync_with_stdio(false);
20     cin.tie(0),cout.tie(0);
21     ll n,k,q;
22     cin>>n>>k>>q;
23     for(int i=1;i<=k;i++)stMax.insert({i,0});
24     for(int i=k+1;i<=n;i++)stMin.insert({i,0});
25 
26     ll sum=0;
27 
28     while(q--){
29         ll x,y;
30         cin>>x>>y;
31     if(k==n){
32         sum += y-a[x];
33         a[x]=y;
34         cout<<sum<<'\n';
35         continue;
36     }
37     if(stMax.find({x,a[x]}) != stMax.end()){
38         stMax.erase({x,a[x]});
39         stMax.insert({x,y});
40         sum += y-a[x];
41         a[x]=y;
42     }
43     else{
44         stMin.erase({x,a[x]});
45         stMin.insert({x,y});
46         a[x]=y;
47     }
48     if(stMax.begin()->val < stMin.rbegin()->val){//反向迭代器,rbegin是从最后一个元素开始
49         auto nodeMax = *stMax.begin();stMax.erase(nodeMax);//取出max中最小值
50         auto nodeMin = *stMin.rbegin();stMin.erase(nodeMin);//取出min中最大值
51 
52         stMax.insert(nodeMin),stMin.insert(nodeMax);
53 
54         sum += nodeMin.val-nodeMax.val;
55 
56     }
57     cout<<sum<<'\n';
58     }
59 
60  }
View Code

 

E:

 

在每个位置插入或替换一个数字,求这个数组的和

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mxn=5e5+6;
 5 ll a[mxn];
 6 
 7 
 8  struct Node{
 9     ll idx,val;
10     bool operator < (const Node &u)const{
11         return val == u.val ? idx < u.idx : val < u.val;//降序排列
12     }
13  };
14 
15 set<Node>stMax,stMin;
16 
17  int main()
18  {
19     std::ios::sync_with_stdio(false);
20     cin.tie(0),cout.tie(0);
21     ll n,k,q;
22     cin>>n>>k>>q;
23     for(int i=1;i<=k;i++)stMax.insert({i,0});
24     for(int i=k+1;i<=n;i++)stMin.insert({i,0});
25 
26     ll sum=0;
27 
28     while(q--){
29         ll x,y;
30         cin>>x>>y;
31     if(k==n){
32         sum += y-a[x];
33         a[x]=y;
34         cout<<sum<<'\n';
35         continue;
36     }
37     if(stMax.find({x,a[x]}) != stMax.end()){
38         stMax.erase({x,a[x]});
39         stMax.insert({x,y});
40         sum += y-a[x];
41         a[x]=y;
42     }
43     else{
44         stMin.erase({x,a[x]});
45         stMin.insert({x,y});
46         a[x]=y;
47     }
48     if(stMax.begin()->val < stMin.rbegin()->val){//反向迭代器,rbegin是从最后一个元素开始
49         auto nodeMax = *stMax.begin();stMax.erase(nodeMax);//取出max中最小值
50         auto nodeMin = *stMin.rbegin();stMin.erase(nodeMin);//取出min中最大值
51 
52         stMax.insert(nodeMin),stMin.insert(nodeMax);
53 
54         sum += nodeMin.val-nodeMax.val;
55 
56     }
57     cout<<sum<<'\n';
58     }
59 
60  }
View Code

 

 

posted @ 2023-08-10 19:17  你也喜欢阿狸吗  阅读(17)  评论(0)    收藏  举报