题解:P11890 [XRCOI Round 1] A. 相聚相逢本无意
思路解析
这题有点过于抽象了,要考虑一堆特殊情况,将近四个小时才调出来,建议至少评黄。
有些特殊情况有点过于极端了,真的就是很难想到,下面我就逐个分析一下。
首先先看特殊性质,因为
然后我们再看第二个子任务,这里的特殊性质是
然后我们再看第三个子任务,这里的特殊性质的
测试一下发现,依然有几个点 WA 了,为什么呢?因为如果一个特殊情况只有
把一二三号子任务结合起来看第四个子任务,仍然会有 WA 的点。这里没有了特殊性质的限制。仔细思考后我们发现,把二三号子任务结合在一起看,如果有一个
再考虑一个新的特殊情况,如果有一个
找明白所有的特殊情况后,我们最终才能得出正确的思路。然后我们就可以开始写代码了。在这里,我使用一个桶数组记录每个数字应该输出多少次,而这些值初始都为一,经过输入限制后再进行修改,最后计算总输出次数然后分别输出即可,如果特判遇到上述所示的所有特殊情况则按要求进行构造或输出无解。这样,我们就完成了整道题目。
代码
#include<bits/stdc++.h>
using namespace std;
long long n,a[100009],ma=0,ans=0;
int main()
{
cin>>n;
for(int i=0;i<=1009;i++)
{
a[i]=1;
}
for(int i=1;i<=n;i++)
{
long long b,c;
cin>>b>>c;
a[b-1]=c;
if(c!=0)ma=max(ma,b);
}
if(ma!=0&&a[-1]!=0)//这里的-1是为了记录x值为0的情况,如果出问题了可以把所有a数组下标右移一位再试
{
cout<<-1;
return 0;
}
if(ma==0&&a[-1]!=0)
{
cout<<a[-1]<<endl;
for(int i=1;i<=a[-1];i++)
{
cout<<1<<" ";
}
return 0;
}
for(int i=0;i<ma;i++)
{
if(a[i]==0)
{
cout<<-1;
return 0;
}
ans+=a[i];
}
cout<<ans<<endl;
for(int i=0;i<ma;i++)
{
for(int j=1;j<=a[i];j++)
{
cout<<i<<" ";
}
}
}
完结撒花!