xht真的好强好强,好厉害
这场打得有点史,共四发罚时还是抽象了,如果没有xht就真的完了呜呜。不过也说明我是真的菜,还有把做法想出来之后验证不到位。
A. Submission Bait
罚时了,15min 才过/lh
稍微想一下可以知道,对于最大数 \(x\),若其出现次数为奇数,那么 A 是必胜的,反之则只能从更小的数开始博弈。结论:当存在出现次数为奇数的数时 A 必胜。因为一个数的出现次数是偶数时是必败态,而 A 就可以让 B 行动时的状态成为必败态。
其实想得挺快的,两三分钟就想到这个解法了,但是因为奇数打成偶数(真的服了自己)导致被人反驳然后一直不敢交/qd
B. Array Craft
罚了两发,更是重量寄。
我们先假设除了 \(1,-1\) 还可以放 \(0\),这样的话构造方案显然是将 \([y,x]\) 赋值为 \(1\),其余为 \(0\)。但是不能填 \(0\),所以考虑将一个 \(0\) 拆成 \(1,-1\) 或 \(-1,1\)。那么答案就显然了:\([1,y-1]\) 倒着轮流填 \(-1,1\) 保证 \(a_{y-1}!=a_y\),\([y,x]\) 填 \(1\),\([x+1,n]\) 轮流填 \(-1,1\)。
C. Mad MAD Sum
先手推一下变换过程。第一次变换会得到一个递增序列 \(b\),再对 \(b\) 进行操作后得到序列 \(c\),发现后续操作每次只会使得 \(c\)
整体向右移一位,也就是删掉 \(c\) 末尾的数,所以对 \(c\) 操作得到的答案就是 \(\sum\limits_{i=1}^n c_i\times(n-i+1)\),注意还要加上前两次变换得到的答案。
D. Grid Puzzle
感觉比 C 好想?
手玩,初步发现染 \(2\times 2\) 的操作会更有的情况只有两种:\(a_i\le2,a_{i+1}\le2\) 或 \(a_i\le2,a_{i+1}\le4,a_{i+2}\le4,a_{i+3}\le2\)。再多考虑一些,发现第二种情况实际上是:\(a_i\le2,a_j\le2,a_k\le4 (i<k<j,i+3\le j)\)。
那么直接 \(1\sim n\) 顺次模拟一遍就行了,开个 \(f1,f2\) 数组记录每一行的前半段和后半段是否被覆盖过,防止答案算重。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=2*114514,M=1919810;
ll T;
ll n,m,k,a[N],ans;
bool f[N],f2[N];
void solve(){
cin>>n;
ans=0;
for(int i=1;i<=n;++i) cin>>a[i],f[i]=f2[i]=0;
for(int i=1;i<=n;++i){
if(a[i]<=0||(a[i]<=2&&f[i])||(a[i]<=4&&f[i]&&f2[i])) continue;
if(a[i]<=2) f[i]=f[i+1]=1,++ans;
else if(a[i]<=4){
if(f2[i]) f[i]=f[i+1]=1;
else if(f[i]) f2[i]=f2[i+1]=1;
++ans;
}
else ++ans;
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>T;
while(T--) solve();
return 0;
}
E1. Catch the Mole(Easy Version)
有点思路,大概是根号分治,赛时只剩半个小时写不出来了,现在懒得补。
大概思路是在深度超过 \(\sqrt{n}\) 的子树中询问,然后…………?
标签:f2,960,奇数,ll,Codeforces,le2,le4,答案,Div From: https://www.cnblogs.com/heshuwan/p/18314929