记录编号 |
157011 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[CEOI1994]数列问题 |
最终得分 |
100 |
用户昵称 |
水中音 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.003 s |
提交时间 |
2015-04-07 07:39:31 |
内存使用 |
0.32 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
int n,i,zj1,sj,pos,neg;
int dis[110],cnt[110];
const int INF=1e9;
int to[300],head[110],com[110],ne[300];
inline void addedge(int u,int v)
{to[++sj]=v,ne[sj]=head[u],head[u]=sj;com[v]++;}
int que[200],qhead=1,qtail=199,qnum=0;bool flag[150];
inline int GET()
{int x=que[qhead];if(++qhead==200)qhead=1;qnum--;flag[x]=0;return x;}
inline void PUSH_fr(int x)
{flag[x]=1,qnum++;if(!(--qhead))qhead=199;que[qhead]=x;}
inline void PUSH_be(int x)
{flag[x]=1,qnum++;if(++qtail==200)qtail=1;que[qtail]=x;}
bool spfa()
{
for(i=0;i<=n;i++)dis[i]=-INF;
cnt[n+1]=1;PUSH_be(n+1);dis[n+1]=0;
while(qnum)for(zj1=GET(),i=head[zj1];i;i=ne[i])
if(dis[to[i]]<dis[zj1]+1)
{
dis[to[i]]=dis[zj1]+1;
if(!flag[to[i]])
{
if(++cnt[to[i]]>n)return 0;
if(qnum&&dis[que[qhead]]<=dis[to[i]])PUSH_fr(to[i]);
else PUSH_be(to[i]);
}
}
return 1;
}
int main()
{
freopen("topoa.in","r",stdin);
freopen("topoa.out","w",stdout);
scanf("%d%d%d",&n,&pos,&neg);
for(i=0;i<=n-pos;i++)addedge(i,i+pos);
for(i=neg;i<=n;i++)addedge(i,i-neg);
for(i=0;i<=n;i++)if(!com[i])addedge(n+1,i);
if(head[n+1])
if(spfa())
{
zj1=dis[0];
for(i=0;i<=n;i++)dis[i]-=zj1;
for(i=n;i>0;i--)dis[i]-=dis[i-1];
for(i=1;i<=n;i++)printf("%d ",dis[i]);
}
else printf("no\n");
else printf("no\n");
return 0;
}