AtCoder-ABC-171题解(A~E)
AtCoder-ABC-171题解(A~E)
A-αlphabet
题意:
小写字母输出a,大写字母输出A。
思路:
直接做即可。
Code:
int main(){
char c;
cin>>c;
if(c>='A'&&c<='Z'){
cout<<"A";
}
else cout<<"a";
}
B- Mix Juice
题意:
给一个长度为N的数组,要求选K个数,求选的K个数的和的最小值。\(N,K<=1000\)
思路:
排序贪心直接做。
Code:
int q[N];
char s[N];
map<int,int>mp,vis;
int main(){
int n;
n=read();
int k;
k=read();
rep(i,1,n){
q[i]=read();
}
sort(q+1,q+1+n);
int sum=0;
rep(i,1,k){
sum+=q[i];
}
cout<<sum;
}
C-One Quadrillion and One Dalmatians
题意:
有若干条小狗,第\(1\)个小狗名字是\(a\),第\(2\)个是\(b\),第27个是\(aa\).....第\(702\)个是\(zz\),询问第\(N\)条小狗的名字是什么。\(1≤N≤1000000000000001\)
思路:
通过题意不难发现,小狗的编号等于小狗的名字在非严格二十六进制下的转换。用第\(702\)条小狗举例子,即\((s[1]-a+1)*26+(s[2]-a+1)=26*26+26=676+26=702\) 。可以发现每一项的系数可以达到\(26\),所以并不是严格意义上的\(26\)进制。所以我们在每一次处理余数前,对\(N\)值\(-1\)即可解决非严格进制的问题。
Code:
int q[N];
map<int,int>mp,vis;
string s="abcdefghijklmnopqrstuvwxyz";
int main(){
ll n;
n=read();
string ans;
while(n){
n--;//每一次求余数前的处理
ans+=s[n%26];
n/=26;
}
reverse(ans.begin(),ans.end());//翻转输出
cout<<ans;
return 0;
}
D - Replacing
题意:
给定一个长度为\(N\)的数组\(A_1,A_2...A_n\)。执行\(Q\)次操作,每次操作给定两个数\(B_i ,C_i\),即将\(A\)数组中所有的\(Bi\)值全部换为\(Ci\).要求输出每次操作后\(A\)数组的权值和。
思路:
输入时预处理拿桶预处理一下每个数出现的次数和前缀和\(sum\),每次操作后维护\(sum\)和桶,模拟即可,注意会爆\(int\)。
Code:
ll q[N];
map<ll,ll>mp,vis;
int main(){
int n;
n=read();
ll sum=0;
rep(i,1,n){
q[i]=read();
mp[q[i]]++;//维护桶
sum+=q[i];//维护前缀和
}
int m;
m=read();
ll l,r;
rep(i,1,m){
scanll2(l,r);
sum-=mp[l]*l;//维护前缀和
mp[r]+=mp[l];//维护桶
sum+=mp[l]*r;//维护前缀和
cout<<sum<<endl;
mp[l]=0;//维护桶
}
return 0;
}
E-Red Scarf
题意:
有\(N\)只猫,每一只猫拥有两种数字,第\(i\)只猫手里掌握着数字\(a_i\),定义每一只猫手里的数字\(a_i=(b_1 \oplus b_2 \oplus... \oplus b_{i-1}\oplus b_{i+1} \oplus b_{i+2}\oplus...\oplus b_n)\)。给出数组\(a\),要求输出数组\(b\)。\(2≤N≤200000\) \(N\)是偶数。
思路:
观察可得,
\((a_1 \oplus a_2 \oplus a_3 \oplus...\oplus a_n)=\begin{matrix} \underbrace{ (b_1 \oplus ...\oplus b_1) } \\ n-1个 \end{matrix} \oplus ...\oplus \begin{matrix} \underbrace{ (b_n \oplus ...\oplus b_n) } \\ n-1个 \end{matrix}=(b_1 \oplus ...\oplus b_n)\)
由题意可得,\(b_i=(b_1 \oplus ...\oplus b_n) \oplus a_i\)
即\(b_i=(a_1 \oplus a_2 \oplus a_3 \oplus...\oplus a_n) \oplus a_i\)
求出\(a\)数组的异或前缀和,运用推导出的结论即可。
Code:
int q[N];
int main(){
int n;
n=read();
rep(i,1,n){
q[i]=read();
}
ll sum=q[1];
rep(i,2,n){
sum^=q[i];//异或前缀和
}
rep(i,1,n){
cout<<(sum^q[i])<<" ";//公式
}
return 0;
}