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

浙公网安备 33010602011771号