A:简单的异或
https://ac.nowcoder.com/acm/contest/63602/A
题意:
^:相同是0,不同是1
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, q;
int a[N][40], sum[N][40];
signed main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i][0];
for(int j = 1; j <= 31; j ++)
a[i][j] = a[i][0] >> (j - 1) & 1;
//存第i个数的二进制数的第j位是不是1
}
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= 31; j ++)
sum[i][j] = sum[i - 1][j] + a[i][j];
//前缀和
cin >> q;
int ans;
while(q --)
{
int x = 0, l, r;
cin >> l >> r;
for(int i = 1; i <= 31; i ++)
{
ans = sum[r][i] - sum[l - 1][i];
//ans是在l到r范围内第i位的1的个数
if(ans < r - l + 1 - ans)
x += 1 << (i - 1);
//如果1的个数小于0的个数
//也就是说:x应该是1的个数大于0的个数时
//这一位给他存上1
}
cout << x << endl;
}
return 0;
}
H:左右横跳
https://ac.nowcoder.com/acm/contest/63602/H?&headNav=acm
题意:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, m, k;
int a[N], f[N];
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//这里必须要加速
cin >> n >> m >> k;
for(int i = 1; i <= n; i ++)
{
for(int j = 0; j < m; j ++)
{
int x; cin >> x;
a[i] = max(a[i], x);//找到每一组的最大值
}
}
f[1] = a[1];
for(int i = 2; i <= n; i ++)
{
f[i] = f[i - 1];//初始化,必须在这里面进行这一步
if(i - k > 0)
f[i] = max(f[i], f[i - k] + a[i]);
}
cout << f[n] << endl;
return 0;
}
J:线代高手
https://ac.nowcoder.com/acm/contest/63602/J
题意:
所以就是暴力判断左上角和右下角就行
#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[55], b[55];
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= m; i ++) cin >> b[i];
vector<int>aa(n + 1, 0), bb(m + 1, 0);
for(int i = 1; i <= n; i ++)
aa[i] = aa[i - 1] + a[i];
for(int i = 1; i <= m; i ++)
bb[i] = bb[i - 1] + b[i];
int x; cin >> x;
int maxn = 0;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
for(int u = 1; u <= n; u ++)
for(int o = 1; o <= m; o ++)
{
int sa = aa[u] - aa[i - 1];
int sb = bb[o] - bb[j - 1];
int s = sa * sb;
if(s <= x)
{
int area = (u - i + 1) * (o - j + 1);
maxn = max(area, maxn);
}
}
cout << maxn << endl;
return 0;
}