思路:區間約束問題,轉最長路跑spf
aspfa
spfa
,注意區間是[0,
50000
][0,50000]
[0,500
00]。但是我們連邊是add
(u−1
,v,w
)add(u-1,v,w)
add(u−
1,v,
w),所以考慮整體右移一位,然後從0
00開始跑,此外還有乙個限制是:
d [v
]−d[
v−1]
∈[0,
1]
d[v]-d[v-1]\in[0,1]
d[v]−d
[v−1
]∈[0
,1]。
再每次構建兩條邊即可。
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int n=
5e4+
10,m=
5e5+
5,inf=
0x3f3f3f3f
,mod=
1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define fmst(a) memset(a,0x3f,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define pii pair
#define fi first
#define se second
#define pb push_back
int n,m,ed=0;
int h[n]
,cnt,vis[n]
,d[n]
,in[n]
;struct edgee[m]
;void
add(
int u,
int v,
int w)
,h[u]
=cnt;
}int
spfa
(int st,
int ed)}}
}return d[ed];}
intmain()
for(
int i=
1;i<=ed;i++
)int x=
spfa(0
,ed)
;printf
("%d\n"
,x);
return0;
}
差分約束 poj 1201 Interval
差分約束 poj 1201 又是一道vector tle。確實很好的差分約束。很好的差分約束,注意隱含條件 0 d i 1 d i 1 題目保證了沒負圈。include include include using namespace std define n 50005 define inf 100...
POJ 1201 樹狀陣列
給你n個區間,每個區間為 a,b 每個區間取c個數構成乙個集合,求集合最小容量 把區間按b排序,從第乙個區間開始取,從後往前取,這樣盡可能和後面的區間重複 另外如果我們發現當前區間取得個數已經超過了c,那麼只需要讓之前區間換就行,而總數是不變的,所以不用更新答案 求當前區間已經取了多少個數用樹狀陣列...
poj 1201 差分約束
傳送門 題意 ai到bi間至少有ci個元素,問所有數中至少有多少元素。額。這樣好像說不清楚,我拿樣例說下吧。3到7之間至少有3個元素,8到10之間至少有3個元素,6到8之間至少有1個元素,1到3之間至少有1個元素,10到11之間至少有1個元素。最少情況如下 1 2 3 4 5 6 7 8 9 10 ...