记录编号 157011 评测结果 AAAAAAAAAA
题目名称 [CEOI1994]数列问题 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 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;
}