Codeforces Round #618 Div. 2
简单B题因为数组越界WA两发这是真的nb可以钉在耻辱上来回摩擦了。
前三题是真的简单wsm我是真的sbbbbb。
被下蛊了。自闭ao
Codeforces Round #618 (Div. 2)
A. Non-zero
要求sum和所有乘积不为0.
有0就ans++,最后sum+ans是0再ans++。
int n,m;
int main(){
int c=ird();
while(c--){
n=ird();
int sum=0;
int ans=0;
for(int i=1;i<=n;i++){
int t=ird();
sum+=t;
if(t==0)
ans++;
}
if(sum+ans==0){
ans++;
}
cout<<ans<<endl;
}
return 0;
}
B. Assigning to Classes
数列分两奇数组,使两中间值差最小
int n,m;
int a[maxn];
int main(){
int c=ird();
while(c--){
n=ird();
for(int i=1;i<=2*n;i++){
a[i]=ird();
}
sort(a+1,a+1+2*n);
cout<<a[n+1]-a[n]<<endl;
}
return 0;
}
C. Anu Has a Function
二进制运算:f(x,y)=(x|y)−y
1 1–>0
0 1–>0
0 0–>0
1 0–>1
按位统计每位1出现次数。倒叙查找如果仅出现一次就放在第一位,break。只有第一个顺序与最后答案的大小相关。
注意倒叙查找一定要开大了找,wa到自闭。
int n,m;
int a[maxn];
vector<int> mp[40];
int main(){
n=ird();
for(int i=1;i<=n;i++){
a[i]=ird();
int t=1;
int num=a[i];
while(num!=0){
t++;
if(num%2)
mp[t].push_back(i);
num/=2;
}
}
for(int i=35;i>=1;i--){
if(mp[i].size()==1){
swap(a[1],a[mp[i][0]]);
break;
}
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
D. Aerodynamic
看了之后气炸了,这场都没上分。我怎么会这么菜啊啊啊啊啊啊啊啊啊啊啊啊啊
题意有一大堆差不多浏览一下,再看看样例。大概意思就是要平行边个数为偶数,输出YES。否则输出NO。
开了个map找贡献。
因为给定的点一定是逆时针的,所以直接遍历一遍找相邻的点就好
int n;
int a[maxn],b[maxn];
map <int,map<int,int> > m;
int main(){
int ans=0;
n=ird();
for(int i=0;i<n;i++){
a[i]=ird();
b[i]=ird();
}
for(int i=0;i<n;i++){
ans+=2;
int x=a[(i+1)%n]-a[i];
int y=b[(i+1)%n]-b[i];
m[x][y]++;
if(m[x][y]%2==0)
ans-=2;
m[-1*x][-1*y]++;
if(m[-1*x][-1*y]%2==0)
ans-=2;
}
if(ans==0){
cout<<"YES"<<endl;
}
else
cout<<"NO"<<endl;
return 0;
}
好像有更快的做法:一对平行边(即偶数个平行边)构成平行四边形,判断对角线中点是不是同一个就okk
int main(){
int ans=0;
n=ird();
for(int i=0;i<n;i++){
a[i]=ird();
b[i]=ird();
}
if(n%2!=0){
cout<<"NO"<<endl;
return 0;
}
for(int i=1;i<n/2;i++){
if(a[i]+a[i+n/2]!=a[0]+a[n/2]||b[i]+b[i+n/2]!=b[0]+b[n/2]){
cout<<"NO"<<endl;
return 0;
}
}
cout<<"YES"<<endl;
return 0;
}