题意:
对题目中给定的si,ni,ki,和一个给定的序列S[1....N]
如果(si,ni,gt,ki),意思就是存在约束条件S[ai]+S[ai+1]+...S[ai+ni] > ki
如果(si,ni,lt,ki),意思就是存在约束条件S[ai]+S[ai+1]+...S[ai+ni] < ki
判断所给的约束条件有无解,有解就输出lamentable kingdom,无解就输出successful conspiracy 。
做法:
差分约束找约束条件。
设sum[i]代表从所有s[1]+s[2]+...+s[i-1];
1,(si,ni,gt,ki),sum[si+ni+1]-sum[si]>=c+1;
2,(si,ni,lt,ki), sum[si+ni+1]-sum[si]<=c-1;
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<string.h>
#define INF 9999999
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
struct list
{
int r;
int len;
int next;
}node[100000];
int head[100000];
int num=0;
int n,m;
int dist[10000];
int vis[10000];
void add(int x,int y,int z)
{
node[num].r=y;
node[num].len=z;
node[num].next=head[x];
head[x]=num++;
}
queue<int>q;
int spfa()
{
int i;
int dist[10000];
int time[10000];
int vis[10000];
mem(vis,0);
mem(time,0);
for(i=0;i<=n+1;i++)dist[i]=-INF;
dist[0]=0;
q.push(0);
vis[0]=1;
while(!q.empty())
{
int e;
e=q.front();
q.pop();
vis[e]=0;
for(i=head[e];i!=-1;i=node[i].next)
{
int v=node[i].r;
if(dist[v]<dist[e]+node[i].len)
{
dist[v]=dist[e]+node[i].len;
if(!vis[v])
{
// printf("%d\n",v);
vis[v]=1;
q.push(v);
time[v]++;
if(time[v]>n+1)return 0;
}
}
}
}
return 1;
}
int main()
{
int i;
int a,b,c;
char str[100];
while(~scanf("%d",&n)&&n)
{
scanf("%d",&m);
mem(head,-1);
num=0;
for(i=0;i<m;i++)
{
scanf("%d%d%s%d",&a,&b,str,&c);
if(str[0]=='g')
{
add(a,a+b+1,c+1);
}
else
add(a+b+1,a,1-c);
}
for(i=1;i<=n+1;i++)
add(0,i,0);
if(spfa())
{
printf("lamentable kingdom\n");
}
else
printf("successful conspiracy\n");
}
return 0;
}