A~E 个人题解
A
#include <iostream>
using namespace std;
int main() {
int n;
string s;
cin>>n>>s;
cout<<s.substr(0,1)+'/'+s.substr(1)<<'\n';
return 0;
}
B
答案为 max(0, 当前众数数量-x的数量)
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
int n,x,y,mx = 0;
cin>>n>>x;
unordered_map<int, int> mp;
while (n--)
cin>>y, mp[y]++, mx = max(mx, mp[y]);
cout<<max(0, mx-mp[x])<<'\n';
return 0;
}
C
先求出x的所有因子数为奇数的因子之积
再从小到大枚举所有完全平方数与这个积相乘,直到在[l,r]之间
#include <iostream>
using namespace std;
int main() {
int x,l,r;
cin>>x>>l>>r;
long long ans = 1;
for (int i=2; i*i<=x; i++) {
if (x%i == 0) {
int cnt = 0;
while (x%i == 0)
x /= i, cnt++;
if (cnt%2)
ans *= i;
}
}
if (x != 1)
ans *= x;
for (int i=1; ; i++) {
long long t = ans*i*i;
if (t > r) {
cout<<-1<<'\n';
return 0;
} else if (t >= l && t <= r) {
cout<<t<<'\n';
break;
}
}
return 0;
}
D
因为a^a = 0,所以如果三个组的异或和相等,那么这三个组的异或和都应该是总体的异或和s
那么可以先求出后缀异或和为s的数组个数
然后从左到右枚举当前缀异或和为s时,累加后缀的异或和为s的个数,中间段不用考虑,因为异或和必为s
#include <iostream>
using namespace std;
int a[200008], suf[200008];
int main() {
int n, ans = 0, t = 0;
cin>>n;
for (int i=1; i<=n; i++)
cin>>a[i], ans ^= a[i];
for (int i=n; i>=1; i--)
t ^= a[i], suf[i] = suf[i+1] + (t == ans);
t = 0;
long long cnt = 0;
for (int i=1; i<=n; i++) {
t ^= a[i];
if (t == ans)
cnt += suf[i+2];
}
cout<<cnt<<'\n';
return 0;
}
E
分类讨论,构造
其实就两大类情况:一上一下的,都在上或都在下的
使用条件运算符?:可以稍微简化一点代码,关键在于找相似的构造规律
注意列坐标都为1或n的特殊情况,以及无解情况的判定
#include <iostream>
using namespace std;
int main() {
int n,s[2],t[2];
cin>>n>>s[0]>>s[1]>>t[0]>>t[1];
if (s[0] != t[0] && (s[1] == t[1] && s[1] != 1 && s[1] != n || abs(s[1]-t[1])%2)
|| s[0] == t[0] && abs(s[1]-t[1])%2 == 0) {
cout<<-1<<'\n';
return 0;
}
if (s[0] != t[0] && s[1] == t[1] && (s[1] == 1 || s[1] == n)) {
cout<<string(n-1, (s[1] == 1 ? 'R' : 'L'));
cout<<(s[0] == 1 ? 'D' : 'U');
cout<<string(n-1, (s[1] == 1 ? 'L' : 'R'));
cout<<'\n';
return 0;
}
if (s[0] == t[0]) {
cout<<(s[1] < t[1] ? string(s[1]-1, 'L') : string(n-s[1], 'R'));
cout<<(s[0] == 1 ? 'D' : 'U');
cout<<(s[1] < t[1] ? string(s[1], 'R') : string(n-s[1]+1, 'L'));
for (int i=1; i<=abs(t[1]-s[1])/2; i++)
cout<<(s[1] < t[1]
? (s[0] == 1 ? "URDR" : "DRUR")
: (s[0] == 1 ? "ULDL" : "DLUL"));
cout<<(s[1] < t[1] ? string(n-t[1], 'R') : string(t[1]-1, 'L'));
cout<<(s[0] == 1 ? 'U' : 'D');
cout<<(s[1] < t[1] ? string(n-t[1], 'L') : string(t[1]-1, 'R'));
} else {
cout<<(s[1] < t[1] ? string(s[1]-1, 'L') : string(n-s[1], 'R'));
cout<<(s[0] == 1 ? 'D' : 'U');
cout<<(s[1] < t[1] ? string(s[1], 'R') : string(n-s[1]+1, 'L'));
for (int i=1; i<=abs(t[1]-s[1])/2-1; i++)
cout<<(s[1] < t[1]
? (s[0] == 1 ? "URDR" : "DRUR")
: (s[0] == 1 ? "ULDL" : "DLUL"));
cout<<(s[1] < t[1]
? (s[0] == 1 ? "UR" : "DR")
: (s[0] == 1 ? "UL" : "DL"));
cout<<(s[1] < t[1] ? string(n-t[1], 'R') : string(t[1]-1, 'L'));
cout<<(s[0] == 1 ? 'D' : 'U');
cout<<(s[1] < t[1] ? string(n-t[1], 'L') : string(t[1]-1, 'R'));
}
cout<<'\n';
return 0;
}



京公网安备 11010502036488号