A(签到)
B(前缀和)
C(构造、位运算、格雷码、分治)
题意 构造一个排列 2^n的排列使得相邻两项的异或和最小
我们要让相邻两个数组的不同位尽可能小 也就是尽可能一位不同而且这个位越小越好
最终构造的排列就是格雷码
也可以直接暴力
遍历每个数字 i 从小到大对每一位j位都异或(1<<j) 得到数字num 如果num没有出现过 那么就是这个数
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
for(int i = 0; i < 1 << n; i++){
cout << (i ^ (i >> 1)) << " ";
}
cout << endl;
}
F(构造)
要保证mex尽可能大
构造方式就是,将多的字符平均分成少的字符数量+1 块,然后在块与块之间填数。
cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
int T = 1;
cin >> T;
while (T--) {
int a, b;
cin >> a >> b;
string t;
if (a == b) {
for (int i = 1; i <= a; i++) {
t += "10";
}
} else {
char c0 = '0', c1 = '1';
if (a < b) {
swap(a, b);
swap(c0, c1);
}
int x = a / (b + 1);
int k = a % (b + 1);
for (int i = 1; i <= b + 1; i++) {
t += string(x + (k > 0), c0);
if (k > 0) k -= 1;
t += c1;
}
t.pop_back();
}
cout << t << endl;
}
}
G(构造)
如果数字中有 0,那很显然至多变化一次就结束了。
如果数字中有 1,实际上不会对答案造成任何影响。
如果数字中有5 ,那么它后续变化中一定都有 ,且数位中一旦出现偶数,就会变 0,导致快速结 束。
如果数字中有 4、6、8、9 ,实际上它们对乘积的贡献等价于 2*2,2*3,2*2*2,3*3。
因此实际上一个数我们只需要看它有几个因子 2、3、7 即可,我们可以枚举这三个因子的个数,然后暴 力检验变化的次数。 最后将这些因子组成数字即可,为了让数字位数最少,就是3个 2变成一个8 ,每2个3 变成一个9 ,多出来的 2和3 组成2 、3、4、6 ,所有的7 都单独作为一个数字。
cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
cout << "27777789999999999 277777788888899" << endl;
}
H(模拟)
代码
cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=505;
int s[N][N];
int n,m,q;
int dx[15]={0,0,0,0,-2,-1,-1,-1,1,1,1,2};
int dy[15]={-2,-1,1,2,0,-1,0,1,-1,0,1,0};
int sum[N][N];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>s[i][j];
}
}
int maxval=-1;
int xa=1,ya=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sum[i][j]+=s[i][j];
for(int k=0;k<12;k++){
int ux=i+dx[k];
int uy=j+dy[k];
if(ux<=n&&uy<=m&&ux>=1&&uy>=1){
sum[i][j]+=s[ux][uy];
}
}
if(sum[i][j]>maxval){
maxval=sum[i][j];
xa=i;ya=j;
}
}
}
while(q--){
int x,y,z;
cin>>x>>y>>z;
s[x][y]+=z;
sum[x][y]+=z;
if(sum[x][y]>maxval){
maxval=sum[x][y];
xa=x;ya=y;
}
for(int k=0;k<12;k++){
int ux=x+dx[k];
int uy=y+dy[k];
if(ux<=n&&uy<=m&&ux>=1&&uy>=1){
sum[ux][uy]+=z;
if(sum[ux][uy]>maxval){
maxval=sum[ux][uy];
xa=ux;ya=uy;
}
}
}
cout<<xa<<' '<<ya<<'\n';
}
return 0;
}