A
把求x的方程列出来后,可以发现实际上看的是奇偶性
奇偶性相同则为整数点,不同则不是整数点
代码如下
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
ios::sync_with_stdio(false);
int t;
for(cin >> t;t--;)
{
int n,x;
int a1,a2,b1,b2;
a1 = a2 = b1 = b2 = 0;
for(cin >> n;n-- && cin >> x;)
if(x & 1)
a1++;
else
a2++;
for(cin >> n;n-- && cin >> x;)
if(x & 1)
b1++;
else
b2++;
cout << a1 * b1 + a2 * b2 << endl;
}
}
B
这道题为了使答案最大,应该让树枝沿一个方向排布
所以将最长的一半的树枝放在一个方向,
将最短的一半的树枝放在其相对的方向
奇数棍子则把中位数放在最长的方向
代码如下
#include <iostream>
#include<algorithm>
#include <cmath>
#define int long long
using namespace std;
int n,a[1234567];
signed main()
{
ios::sync_with_stdio(false);
cin >> n;
for(int i = 1;i <= n;i++)
cin >> a[i];
sort(a + 1,a + n + 1);
int x = 1,sum = 0,sum2 = 0;
for(int i = n;i >= x;i--)
{
sum += a[i];
if(x != i)
sum2 += a[x++];
}
cout << sum * sum + sum2 * sum2 << endl;
}
C
当时做的时候感觉没有思路
后来发现第一行如果严格黑白相间,
整个涂色方案全由第一列决定
如果第一行不是严格黑白相间,
整个涂色方案直接由第一行决定
代码如下
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e6 + 2,D = 1e9 + 7;
int f[N][3];
signed main()
{
int n,m;
cin >> n >> m;
f[1][0] = 2;
for(int i = 2;i <= max(n,m);i++)
(f[i][0] = f[i - 1][0] + f[i - 1][1]) %= D, f[i][1] = f[i - 1][0];
cout << (f[n][0] + f[n][1] + f[m][0] + f[m][1] - 2 + D) % D << endl;
return 0;
}