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