重生之我回到了写P12417的前一秒
Pyrf_uqcat · · 题解
前记(题外)
一觉醒来我重生了。只见眼前出现了一道基础构造练习题,这一世,我要夺回属于我的一切。
确实是构造好题。提交次数和经历的分数都挺多的,反倒可以当游记了。
分数经历:
共交了 34 次,起到了拉低通过率的作用。
对于存答案的方式
本来是用二维数组存的,需要一个变量记录答案总数。还是改成 vector< pair<int,int> > ans 更好。可以通过输出长度体现答案。
存储似乎定义函数更好:
inline void add(int x,int y)
{
ans.push_back(make_pair(x,y));
}
输出答案(先输出长度):
cout<<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
发现当
可以采取反复对半开分治的方法:
先将每
void 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 调了一下,就是上面的思路。
void 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
样例过不了,特判