题解 | #01串#

01串

https://ac.nowcoder.com/acm/problem/16855

差分约束 模板题 找到不等式 建立边 跑spfa(有负权边)如果有负环 则不存在

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int h[N],ne[2*N],e[2*N],w[2*N],idx,co[N],st[N],d[N],n;

void add(int a,int b,int c){
	e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}

bool spfa(){
	memset(d,0x3f,sizeof d);
	d[0]=0;
	queue<int> q;
	q.push(0);st[0]=1;
	while(q.size())
	{
		auto t=q.front();
		q.pop();
		st[t]=0;
		for(int i=h[t];i!=-1;i=ne[i]){
			int j=e[i];
			if(d[j]>d[t]+w[i]){
				d[j]=d[t]+w[i];
				co[j]++;
				if(co[j]>=n)	return false;
				if(!st[j]){
					st[j]=1;
					q.push(j);
				}
			}
		}
	}return true;
}

int main(){
	memset(h,-1,sizeof h);
	int	a0,b0,l0,a1,b1,l1;
	cin>>n>>a0>>b0>>l0>>a1>>b1>>l1;
	for(int i=1;i<=n;i++)	
		add(i-1,i,1),add(i,i-1,0);
	for(int l=1,r=l0;r<=n;l++,r++)
		add(r,l-1,b0-l0),add(l-1,r,l0-a0);
	for(int l=1,r=l1;r<=n;l++,r++)
		add(r,l-1,-a1),add(l-1,r,b1);
	if(spfa())	
		for(int i=1;i<=n;i++)	
			cout<<d[i]-d[i-1];
	else	cout<<-1<<endl;
	return 0;
}
全部评论

相关推荐

昨天 18:38
门头沟学院 运营
点赞 评论 收藏
分享
Ncsbbss:又想干活又想要工资,怎么什么好事都让你占了
点赞 评论 收藏
分享
面了这么多场试,总有公司总喜欢压力面一个小时面试+手撕,哪里不会就点哪里,说了不会不会还继续追着问不尊重求职者,稍微有些细节记不清了,就开始怀疑项目真实性以及人格让求职者开摄像头但是自己不开,说话声音还贼小,pardon几次就开始不耐烦的不知道这个算不算,手撕的时候,面试官人跑了。。。最后快结束才来
一纸丿繁华丶:你换位思考一下,自己在职场被领导push麻了,身心俱疲,现在有个机会让你放松一下,体验一把上位者的感觉,还能看着那些高学历人才、未来自己的竞争者,抓耳挠腮、手足无措的样子,没给你当场笑出来就不错了,理解一下面试官吧。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务