前言:
参加的第二场cf比赛,这场比赛又只过了两道,第三道就差那么一点点就能过了,可惜时间到了,其实主要还是我codeing的速度太慢了吧,还需练习啊。
正文:
比赛链接:Dashboard - Codeforces Round 960 (Div. 2) - Codeforces
A. Submission Bait:
#include <bits/stdc++.h>
using namespace std;
int a[100];
int main(){
int t;
cin>>t;
while(t--){
memset(a,0,sizeof(a));
int n,x,res=0,flag=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
a[x]++;
}
for(int i=n;i>=1;i--){
if(a[i]==0)continue;
if(a[i]%2==1){
flag=1;
break;
}
}
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
博弈相关的问题,题目大意是依次在数组里选数,后面的人选的数必须要比前面的大于或等于,问先手怎样必赢,我们很容易想到先手要输只能是这个数组里所有数出现的次数都为偶数,直接遍历判断即可。
B. Array Craft:
#include <bits/stdc++.h>
using namespace std;
int a[200005];
int main(){
int t;
cin>>t;
while(t--){
int n,x,y;
cin>>n>>x>>y;
for(int i=y;i<=x;i++){
a[i]=1;
}
for(int i=x+1;i<=n;i++){
if(a[i-1]>=0)a[i]=-1;
else a[i]=1;
}
for(int i=y-1;i>=1;i--){
if(a[i+1]>=0)a[i]=-1;
else a[i]=1;
}
for(int i=1;i<=n;i++)cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
思维题,题目大意是告诉你一个只含1和-1的数组的最大前缀的第一次出现点x和最大后缀的第一次出现点y(x>y),让你输出原数组(答案不唯一但一定存在),我的做法就是让x和y之间的数都为一,1到y-1的数为-1,1,-1,1……,n到x+1的数为-1,1,-1,1……,这样得出的答案一定为正确答案。
C. Mad MAD Sum:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[200005],b[200005],c[200005],pre[200005];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
ll ans=0;ll res=0;
map<int,int> b;map<int,int> p;
for(int i=1;i<=n;i++){
cin>>a[i];ans+=a[i];
b[a[i]]++;
if(b[a[i]]>=2){
res=max(a[i],res);
}
c[i]=res;
// cout<<c[i]<<" ";
}
res=0;
for(int i=1;i<=n;i++){
ans+=c[i];
p[c[i]]++;
if(p[c[i]]>=2){
res=max(c[i],res);
}
a[i]=res;
//cout<<a[i]<<" ";
}
for(int i=1;i<=n;i++){
pre[i]=pre[i-1]+a[i];
ans+=pre[i];
}
cout<<ans<<endl;
}
return 0;
}
这题真是让我很意难平了,真的是就差一步了,b,p原先用的数组来当桶,不过因为清零超时了,当时就剩个10来秒要是改map改的快的话说不定就过了(悲)。题目大意是让我们对一个数组进行求和,不过每次求和过后原数组都会按一定规则发生改变,改变的规则如题所示,问我们最后的答案。这题看似很复杂,其实也不简单,但只要你细心就一定会发现数组第一次改变后会变得有序,第二次改变就只会剩下出现两次的数字,而从三次开始后数组的变化就相当于是将变化前数组向后移动一位(第一位补0),去掉后面移动出数组范围的数字,直至数组元素全为0结束(不信可以自己写一个数组推推试试),从第三次开始到最后加和的总值我们很容易看出来其实就是对第二次变化后的数组的前缀和数组求和的值,我们可以先通过两次循环来求解二次变化后的数组,顺便将前两次的和也一起加上,这样就可以得出答案。
待补(咕咕咕):
D. Grid Puzzle
E1. Catch the Mole(Easy Version)
E2. Catch the Mole(Hard Version)
F. Polygonal Segments
后记:
codeforce上比赛题目的质量确实不错,而且更考验思维,不会说很生硬的考察算法。