目录
G2. Subsequence Addition (Hard Version)
A. Plus or Minus
直接模拟
void solve()
{
int a,b,c; cin>>a>>b>>c;
a+b==c?puts("+"):puts("-");
return ;
}
B. Grab the Candies
先偶数再奇数即可所有只需要看总和
void solve()
{
cin>>n;
LL s1=0,s2=0;
for(int i=1;i<=n;i++)
{
int x; cin>>x;
if(x&1) s2+=x;
else s1+=x;
}
s1>s2?puts("YES"):puts("NO");
return ;
}
C. Find and Replace
直接第一个变成0或者1都行后面一定会对应变化如果是出现相等就不行
void solve()
{
cin>>n;
string a; cin>>a;
int f=0;
q[a[0]]=1;
for(int i=1;i<n;i++)
{
if(!q.count(a[i])) q[a[i]]=q[a[i-1]]^1;
if(q[a[i]]==q[a[i-1]])
{
f=1;
break;
}
}
q.clear();
if(f) puts("NO");
else puts("YES");
return ;
}
D. Odd Queries
简单区间查询直接使用前缀和进行维护即可
void solve()
{
cin>>n>>m;
LL sum=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
a[i]+=a[i-1];
}
while(m--)
{
int l,r,k; cin>>l>>r>>k;
//l++,r++;
LL ans=a[l-1]-a[r];
LL res=sum+ans+k*(r-l+1);
if(res&1) puts("YES");
else puts("NO");
}
E. Interview
简单交互题一般都是二分我们这里使用前缀和维护然后二分查询是不是满足然后改变中间mid即可
void solve()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],sum[i]=a[i];
for(int i=1;i<=n;i++) sum[i]+=sum[i-1];
int l=1,r=n;
while(l<r)
{
int mid=l+r>>1;
cout<<"? "<<mid-l+1<<" ";
fflush(stdout);
for(int i=l;i<=mid;i++){
cout<<i<<" ";
fflush(stdout);
}
cout<<endl;
fflush(stdout);
ll res; cin>>res;
if(res!=sum[mid]-sum[l-1]) r=mid;
else l=mid+1;
}
cout<<"! "<<l<<endl;
fflush(stdout);
return ;
}
F. Bouncy Ball
我们直接模拟弹弹的这个过程接着我们发现题目提示我们nm的数据范围我们最多弹nm所有点都有了依照鸽巢原理一定会重复所以这个时候推出即可
void solve()
{
cin>>n>>m>>sx>>sy>>ex>>ey>>s;
int x,y;
if(s[0]=='D') x=1; else x=-1;
if(s[1]=='R') y=1; else y=-1;
int ans=0;
bool flag=false;
int res=0;
while(sx!=ex||sy!=ey)
{
int f=0;
res++;
if(sx+x>n||sx+x<=0) x=-x,f++,ans++;
if(sy+y>m||sy+y<=0) y=-y,f++,ans++;
if(f==2) ans--;
sx+=x,sy+=y;
if(ans>n*m){
flag=true;
break;
}
}
if(!flag) cout<<ans<<endl;
else cout<<-1<<endl;
return ;
}
G2. Subsequence Addition (Hard Version)
后面的数一定是由前面的数构成的如果说你这个数比前面的总和还要大是肯定不可能的前面的数可以构造出后面的所有的数所以进行前缀和维护即可
void solve()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
if(a[1]!=1){
cout<<"NO"<<endl;
return ;
}
b[0]=0;
for(int i=1;i<=n;i++) b[i]=b[i-1]+a[i];
b[0]=1;
for(int i=1;i<=n;i++){
if(a[i]>b[i-1]){
cout<<"NO"<<endl;
return ;
}
}
cout<<"YES"<<endl;
return ;
}