文章目录
Codeforces Round #594 (Div. 2)
A. Integer Points
有一个长度为n的序列p1,p2…pn,代表n条直线 y=x+pi
有一个长度为m的序列q1,q2…qm,代表m条直线 y=-x+qi
问这n+m条直线之间有多少个整数交点。
题解:
y = x + p i y=x+pi y=x+pi y = ( p i + q i ) / 2 y=(pi+qi)/2 y=(pi+qi)/2
− > - > −>
y = − x + q i y=-x+qi y=−x+qi x = ( p i − q i ) / 2 x=(pi-qi)/2 x=(pi−qi)/2
所以找到 p i pi pi与 q i qi qi同奇同偶的对数即可
#include <bits/stdc++.h>
using namespace std;
int a[1000010],h1[2],h2[2],b[10000010];
int main()
{
int n,T,i,m;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
h1[0]=h1[1]=h2[0]=h2[1]=0;
for(i=1; i<=n; i++) scanf("%d",&a[i]),h1[a[i]%2]++;
scanf("%d",&m);
for(i=1; i<=m; i++) scanf("%d",&b[i]),h2[b[i]%2]++;
long long ans=0;
ans=1ll*h1[0]*h2[0]+1ll*h2[1]*h1[1];
printf("%lld\n",ans);
}
return 0;
}
B. Grow The Tree
有n个木棍,从(0,0)点开始,每次你可以选一根木棍平行于x轴或y轴的摆,但不能有连续两个或以上的木棍是选择同一状态的(只能横竖横竖或竖横竖横地摆)。每次木棍摆的起始位置是上一根木棍的结束位置,问最后一条木棍的终点距离(0,0)点最远的距离的平方最大是多少。
题解:
- 需要将两个部分和的差值尽可能大
- 若n为偶数,则两个部分刚好为前 n / 2 n/2 n/2小的数,后 n / 2 n/2 n/2大的数
- 若n为奇数,则两个部分为前 ( n − 1 ) / 2 (n-1)/2 (n−1)/2小的数,后 ( n + 1 ) / 2 (n+1)/2 (n+1)/2大的数
#include <bits/stdc++.h>
using namespace std;