A.游游的字母变换
使用islower 和 isupper来判断大小写字母,接着使用%26的性质转化
void solve(){
string s; cin>>s;
for(auto&v:s){
if(isupper(v)){
int t = (v-'A'+1)%26;
v = t + 'A';
}
else if(islower(v)){
int t = (v-'a'-1+26)%26;
v = t + 'a';
}
}
cout << s << endl;
return ;
}
B.游游的排列构造
依照题目意思,最多k只有n的一半,我们直接将n-m+1大的数间隔插入,中间放1,2,3这些即可,注意间隔的数要小于n-m+1
void solve(){
cin>>n>>m;
int j = 1;
for(int i=1;i<=m;i++,j++){
cout << n-m+j << ' ';
if(j<n-m+1) cout << j << ' ';
}
while(j<n-m+1) cout << j++ << ' ';
return ;
}
C.游游的二进制树
可以发现数据范围很小直接暴力dfs,注意大于r的时候终止
void solve(){
LL l,r;
cin>>n>>l>>r;
vector<vector<int>> g(n+1);
string s; cin>>s; s=' '+s;
for(int i=1;i<n;i++){
int a,b; cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
int ans = 0;
function<void(int,int,LL)> dfs = [&](int u,int fa,LL res){
res = res * 2 + (s[u]-'0');
if(res>r) return ;
if(u != fa and l<=res and res<=r) ans++;
for(auto&v:g[u]){
if(v == fa) continue;
dfs(v,u,res);
}
};
for(int i=1;i<=n;i++) dfs(i,i,0ll);
cout << ans << endl;
return ;
}
D.游游的矩阵统计
注意到数值是很大的但是数量不大,所以肯定是双指针去滑动区间,注意贡献的区间是几个个区间的拼接区域 + 两个 区间的连续区域 我们考虑一直维护两个区间的相同数据量,到区间尽头了就滑动指针即可
void solve(){
LL n; int m1,m2;
cin>>n>>m1>>m2;
vector<pair<int,LL>> v1(m1),v2(m2);
for(auto&[a,b]:v1) cin>>a>>b;
for(auto&[a,b]:v2) cin>>a>>b;
int i = 0, j = 0;
int li = -1, lj = -1;
LL x = 0,y = 0;
LL ans = 0;
while(i<m1){
LL same = min(v1[i].second-x,v2[j].second-y);
int ni = v1[i].first, nj = v2[j].first;
ans += ~li and (set{li,lj,ni,nj}.size() == 2);
if(ni != nj) ans += same - 1;
x += same;
if(x == v1[i].second){
x = 0;
i++;
}
y += same;
if(y == v2[j].second){
y = 0;
j++;
}
li = ni,lj = nj;
}
cout << ans << endl;
return ;
}
E.小红的树构造
首先我们找出所有出现数的因数数量
可以发现4,9的因数都是3
6,8,27都是4
12,18都是6
可以发现突破点就是让因数小的出现的多,那么也就是2*3出现的越少越好那我们可以想到构造菊花图,把数量多的放在中间即可
LL qmi(LL a,LL b,LL p){
LL res = 1;
while(b){
if(b&1) res = res * a % p;
b >>= 1;
a = a * a % p;
}
return res;
}
void solve(){
cin>>n>>k;
k = max(k,n-k);
LL ans = qmi(3,k-1,mod) % mod * // 自己^2 (4 9) ->3
qmi(4,n-k,mod) % mod * // 自己 x 别人 (6) -> 4
qmi(4,(LL)(k-1)*(k-2)/2,mod) % mod * // 自己^3 (8,27) -> 4
qmi(6,(LL)(n-k)*(n-k-1)/2,mod) % mod * // 自己 x 别人^2
qmi(6,(LL)(k-1)*(n-k),mod) % mod; // 自己^2 x 别人
cout << ans << endl;
return ;
}