ABC 记录+题解合集
开坑开坑!
你说的对,但其实是因为得上分打 ARC 来着。
ABC420
A
\((X+Y-1) \bmod 12 +1\)
B
依题意统计。
因为不需要真的输出得分,所以全体投票相同的情形并不需要特判。
for(int i=1;i<=n;++i) num[id[i][t]]++;
for(int i=1;i<=n;++i){
if(num[id[i][t]]*2<n){
pts[i]++;
}
}
这样码量小不少。
C
典中典之每次只会改变一个对答案有贡献的值。
做之前先减掉,做完再加回来即可。
D
被翻译小坑了一手,以为到终点时也要为初始状态来着。
记 \((x,y,0/1)\) BFS 一遍即可。
E
并查集维护连通块中黑点个数即可。
F
感觉是比较不简单的一道题捏。
考虑对每一行扫描线地看。
用 \(dep\) 表示一个点向上最多能走几个.,建出小根笛卡尔树。
则跨过当前节点的区间的高最多为 \(dep_u\).
记 \(l,r(l\le r)\) 分别为分治中两个子区间的长度。
发现区间的出现次数是:\(1,2,...,l,l+1,l+1,...,l+1,l,l-1,..,1\).
而长度 \(\le k/dep_u\) 的有 \(dep[u]\) 个,大于的有 \(k/len\) 个,分讨一下即可。
for(int i=1;i<=m;++i){
sum1[i]=sum1[i-1]+(k/i)*i;
sum2[i]=sum2[i-1]+(k/i);
}
long long calc(int l,int r){
return 1ll*(r-l+1)*(l+r)/2;
}
if(dep[rt]!=0){
int lim1=min(rt-l+1,r-rt+1),lim2=max(rt-l+1,r-rt+1),lim3=min(r-l+1,k/dep[rt]),lim4=r-l+1;
if(lim3<=lim1){
ans+=calc(1,lim3)*dep[rt];
ans+=sum1[lim1]-sum1[lim3];
ans+=(sum2[lim2]-sum2[lim1])*lim1;
ans+=(lim4+1)*(sum2[lim4]-sum2[lim2])-(sum1[lim4]-sum1[lim2]);
}else if(lim3<=lim2){
ans+=calc(1,lim1)*dep[rt];
ans+=1ll*(lim3-lim1)*(lim1)*dep[rt];
ans+=(sum2[lim2]-sum2[lim3])*lim1;
ans+=(lim4+1)*(sum2[lim4]-sum2[lim2])-(sum1[lim4]-sum1[lim2]);
}else{
ans+=calc(1,lim1)*dep[rt];
ans+=1ll*(lim2-lim1)*(lim1)*dep[rt];
ans+=calc(lim1-(lim3-lim2),lim1-1)*dep[rt];
ans+=(lim4+1)*(sum2[lim4]-sum2[lim3])-(sum1[lim4]-sum1[lim3]);
}
}
你说的对,但是我的翻译怎么给我翻出来恰好由 \(K\) 个单元格组成来着。
G
有点送捏。
记根号开出来是 \(t(t\ge0)\),化简一下发现 \(1-4X=(2n-2t+1)(2n+2t+1)\)。
找出所有因子,匹配相加即可得到 \(2n+1\) 的值。
懒得分析了,意识到因子个数只有 \(O(X^{\frac{1}{3}})\),所以可以直接排一手序,就没了。

浙公网安备 33010602011771号