记录编号 60027 评测结果 AAAAA
题目名称 [NOI 1999]01串 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2013-05-15 21:24:41 内存使用 0.88 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<deque>
using namespace std;
const int SIZEN=1010;
int N,A0,B0,L0,A1,B1,L1;
//长度N
class EDGE{
public:
	int b,t;
	EDGE(){b=t=0;}
};
deque<EDGE> c[SIZEN];
void addedge(int a,int b,int t){
	EDGE temp;
	temp.b=b,temp.t=t;
	c[a].push_back(temp);
}
void read(void){
	scanf("%d%d%d%d%d%d%d",&N,&A0,&B0,&L0,&A1,&B1,&L1);
	int i;
	for(i=0;i+L0<=N;i++){//S0(i+L0)-S0(i)∈[A0,B0]
	//有一条边从i指向i+L0权值为A0,另一条边从i+L0指向i权值为-B0
		addedge(i,i+L0,A0);
		addedge(i+L0,i,-B0);
	}
	for(i=0;i+L1<=N;i++){//S0(i+L1)-S0(i)∈[L1-B1,L1-A1]
	//有一条边从i指向i+L1权值为L1-B1,另一条边从i+L1指向i权值为A1-L1
		addedge(i,i+L1,L1-B1);
		addedge(i+L1,i,A1-L1);
	}
	for(i=0;i<=N;i++) addedge(N+1,i,0);
	for(i=0;i<N;i++) addedge(i,i+1,0),addedge(i+1,i,-1);
}
int f[SIZEN]={0};
const int MIN=-0x7fffffff;
bool SPFA(int s){
	deque<int> Q;
	int tp[SIZEN]={0};//入队次数
	bool inq[SIZEN]={0};//是否在队里
	int x,i,y;
	for(i=0;i<=N;i++) f[i]=MIN;
	Q.push_back(s);tp[s]=1;f[s]=0;inq[s]=true;
	while(Q.size()){
		x=Q.front();Q.pop_front();inq[x]=false;
		for(i=0;i<(int)c[x].size();i++){
			y=c[x][i].b;
			if(tp[y]==N+1){//正环
				return false;
			}
			if(f[x]+c[x][i].t>f[y]){
				f[y]=f[x]+c[x][i].t;
				if(!inq[y]){
					Q.push_back(y);
					inq[y]=true;tp[y]++;
				}
			}
		}
	}
	return true;
}
int a[SIZEN]={0};
void write(void){
	int i;
	for(i=1;i<=N;i++) printf("%d",1-(f[i]-f[i-1]));
	printf("\n");
}
int main(){
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout);
	read();
	if(SPFA(N+1)) write();
	else printf("-1\n");
	return 0;
}