A - Product
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
int a, b;
int main(){
cin >> a >> b;
if ((a * b) & 1) cout << "Odd" << endl;
else
cout << "Even" << endl;
return 0;
}
B - 1 21
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
int a, b;
int get(int num) {
int res = 0;
while (num) {
res++;
num /= 10;
}
return res;
}
int main() {
cin >> a >> b;
int c = a * pow(10,get(b) ) + b;
for (int i = 1; i <= sqrt(c); i++) {
if (i * i == c) {
cout << "Yes" << endl;
return 0;
}
}
cout << "No" << endl;
return 0;
}
C - Traveling
一个无限大的二维网格,从原点出发,现在给出n个点,问能否在(t_i)秒正好到达((x_i,y_i))位置
直接计算相邻两个询问的曼哈顿距离,如果距离小于时间差必然不可能达到,否则如果距离-时间为偶数那么可以到达,否则不能到达
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
int n;
int main() {
cin >> n;
int nowx = 0, nowy = 0, nowt = 0;
int flag = 0;
while (n--) {
int x, y, t;
cin >> t >> x >> y;
if ((abs(x - nowx) + abs(y - nowy) > (t - nowt)) ||
(((t - nowt) - abs(x - nowx) - abs(y - nowy)) % 2 == 1)) {
flag = 1;
}
nowx = x, nowy = y, nowt = t;
}
if (flag)
cout << "No" << endl;
else
cout << "Yes" << endl;
return 0;
}
D - Checker
给出n个点,现在要将一个无限大的二维网格进行涂色,每个白色区域占(k*k)个网格,黑色也是同样
现在规定了n个点的颜色,问最多能有多少个点满足条件
因为点很多,所以需要将其映射到一个较小的区间
仔细观察可以发现,如果将坐标对2k取模的话,不改变颜色,所以可以将n个点映射到(2k*2k)的小区间内
然后由于涂色方案不定,所以可以枚举全部的方法,将每种涂色方法看做最初的一种方法平移而来
例如:
红框圈起来的范围可以看做一种方案,此时白色有5个区域,黑色有4个区域,如果再将其平移k个单位,黑白颜色会对调,所以不需要平移2k个距离,只需平移k次,每次分别计算白色有5个区域和白色有4个区域的情况即可
最后就是利用前缀和,直接常数时间内求出每种涂色方法的答案即可
这个题写了1个半小时...写下标写的头痛...
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 5;
typedef long long LL;
int n, k;
int sumw[N][N], sumb[N][N], w[N][N], b[N][N];
bool check(int num){
if (num >= 1 && num <= 2 * k) return true;
else
return false;
}
int getsumw(int l1, int r1, int l2, int r2) {
if (l2 < l1 || r2 < r1) return 0;
if(!(check(l1)&&check(l2)&&check(r1)&&check(r2)))return 0;
return sumw[l2][r2] - sumw[l2][r1 - 1] - sumw[l1 - 1][r2] +
sumw[l1 - 1][r1 - 1];
}
int getsumb(int l1, int r1, int l2, int r2) {
if (l2 < l1 || r2 < r1) return 0;
if(!(check(l1)&&check(l2)&&check(r1)&&check(r2)))return 0;
return sumb[l2][r2] - sumb[l2][r1 - 1] - sumb[l1 - 1][r2] +
sumb[l1 - 1][r1 - 1];
}
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) {
int x, y;
char c;
cin >> x >> y >> c;
if (c == 'B') {
b[x % (2 * k) + 1][y % (2 * k) + 1]++;
} else {
w[x % (2 * k) + 1][y % (2 * k) + 1]++;
}
}
for (int i = 1; i <= 2 * k; i++) {
for (int j = 1; j <= 2 * k; j++) {
sumb[i][j] =
sumb[i - 1][j] + sumb[i][j - 1] - sumb[i - 1][j - 1] + b[i][j];
sumw[i][j] =
sumw[i - 1][j] + sumw[i][j - 1] - sumw[i - 1][j - 1] + w[i][j];
}
}
int res = 0;
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
res = max(res,
getsumw(1, 1, k - i, k - j) +
getsumw(k + 1 - i, k + 1 - j, 2 * k - i, 2 * k - j) +
getsumw(1, 2 * k + 1 - j, k - i, 2 * k) +
getsumw(2 * k + 1 - i, 1, 2 * k, k - j) +
getsumw(2 * k + 1 - i, 2 * k+1 - j, 2 * k, 2 * k) +
getsumb(1, k+1 - j, k - i, 2 * k - j) +
getsumb(k + 1 - i, 1, 2 * k - i, k - j) +
getsumb(2 * k + 1 - i, k + 1 - j, 2 * k, 2 * k-j) +
getsumb(k + 1 - i, 2*k + 1- j, 2 * k-i, 2 * k));
res = max(res,
getsumb(1, 1, k - i, k - j) +
getsumb(k + 1 - i, k + 1 - j, 2 * k - i, 2 * k - j) +
getsumb(1, 2 * k + 1 - j, k - i, 2 * k) +
getsumb(2 * k + 1 - i, 1, 2 * k, k - j) +
getsumb(2 * k + 1 - i, 2 * k+1 - j, 2 * k, 2 * k) +
getsumw(1, k+1 - j, k - i, 2 * k - j) +
getsumw(k + 1 - i, 1, 2 * k - i, k - j) +
getsumw(2 * k + 1 - i, k + 1 - j, 2 * k, 2 * k-j) +
getsumw(k + 1 - i, 2*k + 1- j, 2 * k-i, 2 * k));
}
}
cout << res << endl;
return 0;
}