专栏文章
重生之我回到了写P12417的前一秒
P12417题解参与者 12已保存评论 11
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 11 条
- 当前快照
- 1 份
- 快照标识符
- @mip2ogql
- 此快照首次捕获于
- 2025/12/03 05:10 3 个月前
- 此快照最后确认于
- 2025/12/03 05:10 3 个月前
前记(题外)
一觉醒来我重生了。只见眼前出现了一道基础构造练习题,这一世,我要夺回属于我的一切。
确实是构造好题。提交次数和经历的分数都挺多的,反倒可以当游记了。
分数经历:
对于存答案的方式
本来是用二维数组存的,需要一个变量记录答案总数。还是改成
vector< pair<int,int> > ans 更好。可以通过输出长度体现答案。存储似乎定义函数更好:
CPPinline void add(int x,int y)
{
ans.push_back(make_pair(x,y));
}
输出答案(先输出长度):
CPPcout<<ans.size()<<"\n";
for(int i=0;i<ans.size();i++)
{
cout<<ans[i].first<<' '<<ans[i].second<<"\n";
}
注意:每组数据请先清空。
14 pts
先看一眼子任务一,尝试先过一。
提供两种做法:
做法一:根据样例中
2 和 4 有解,3 无解可得:偶数有解,奇数无解。做法二(证明):最终的序列一定是由两两配对二次,奇数通过分割后必然存在奇数无法配对,故奇数无法成立。
16 pts
我还以为 把每个都乘上一遍就好了,后来发现只有 时成立。(
33 pts
发现当 时规律还挺好找的。
可以采取反复对半开分治的方法:
先将每 个数配对,在通过 次操作可以将四个数合并成一样的。然后再通过 操作将 个数合并直至合并出 个一样的数。
CPPvoid dfs(int l,int r)
{
if(l==r-1)
{
add(l,r);
return ;
}
int mid=(l+r)>>1;
dfs(l,mid),dfs(mid+1,r);
for(int i=l;i<=mid;i++) add(i,mid+i-l+1);
}
36 pts
由 33 pts 做法得到我们已经会了 个数的合并,这时想到我如果会 就可以通过分治解决所有的 。毕竟分来分去都是偶数,处理长度的二分之一进行奇数和偶数分讨即可。
然后尝试爆推 ,不推 是因为太小了出不了规律。搞了两个小时的规律:
将前 个 与最后一个 配对:
前 个首尾配对:
采取
9 和 10,7 和 9 再 9 和 10。然后得出了普遍规律:
当遇到一堆 和 个 时,将其分为两部分: 个 为一部分, 个 和 个 为一部分。将 个 都乘一遍最后一个 ,得到 。采取首尾配对(有点像求和公式的推导),第一部分全部变成 。第二部分将最后两个先变成 ,再以一三二四配对得到 个 ,这样整个序列都变成了 。
关于我为什么过不了子任务二,那是因为有部分合并写错了(
代码放在 63 pts 处。
63 pts
把 26 pts 调了一下,就是上面的思路。
CPPvoid f(int l,int r)
{
if(l==r-1)
{
add(l,r);
return ;
}
if(l==r) return ;
int len=r-l+1;
if((len/2)%2==1)
{
int mid=(l+r)>>1;
f(l,r-2),f(r-1,r);
for(int i=l;i<=r-4;i++) add(i,r);
for(int i=l;i<=(r-4)-(r-4-l+1)/2;i++) add(i,r-4+l-i);
add(r-1,r),add(r-3,r-1),add(r-2,r);
}
else
{
int mid=(l+r)>>1;
f(l,mid),f(mid+1,r);
for(int i=l;i<=mid;i++) add(i,mid+i-l+1);
}
}
0 pts
尝试重构。重构,重构!
每添加 个数就要把整个序列都扫一篇,还是太劣了。不过偶然间看到别人所说的互补使我有些思路。
还是和 63 pts 一样,爆推 。那就先不把前 个变成一样的。
像之前的分部分一样,将最后的 提出,以 也就是前 个为第一部分,剩下 个也就是 个分为第二部分。且将两部分通过 此操作变成一样。
注意:不需要把每个数变成一样浪费次数
第一部分正着过一遍 ,第二部分倒着过一遍 。依次操作。
赶紧简化第二部分:
显然这个时候将第 个和第 个操作一遍是不一样的。
先看 ,第一个乘积为 但是后面都是 ,看来 先操作使得所有都是三次方。然后后面多出来的 至 都不会有多出来的三次方(其实是意外之举,效果出其不意)。
将先乘的与第一组最后一个操作,后面全部错位。
现在前 项就都是 。后两项为 ,那我们开始时就把 和 操作一下,这样就不会少 了。
同理得 时答案。
解决了。。。吗??
怎么是零分啊,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!
100 pts
样例过不了,特判 。我果然不太聪明。
相关推荐
评论
共 11 条评论,欢迎与作者交流。
正在加载评论...