題目描述
給定n個閉區間[ai,bi]和n個整數ci。你需要構造乙個整數集合z,使得對於任意i,z中滿足ai<=x<=bi的x不少於ci個。求z集合中包含的元素個數的最小值。
輸入第一行為乙個整數n(1<=n<=50000)
接下來n行每行描述乙個區間,三個整數分別表示ai,bi和ci。( 0 <= ai <= bi <= 50000 並且 1 <= ci <= bi - ai+1.)
輸出輸出乙個整數,表示z中包含元素個數的最小值。
樣例輸入
53 7 3
8 10 3
6 8 1
1 3 1
10 11 1
樣例輸出
6
由題意我們可以知道b[i]-a[i]+1>=c[i]
兩邊同時除以-1,
a[i]-1-b[i]<=-c[i]
a[i]<=(b[i]+1)+(-c[i])
這個式子很熟悉有沒有?
如果沒有,看這個
d[i]<=d[j]+edge(j,i)
記得這個嗎?對於乙個無法鬆弛的單源最短路圖,必滿足上述關係
所以我們在最短路中把(j,i)連邊 在本題中將(b[i]+1,a[i])連邊 該過程稱為差分約束用d[i]表示從0-i區間中需要選的數
但是應當注意的是 明顯d[0]不一定=0 所以我們需要乙個虛擬點作為原點
怎樣找這個虛擬點?因為前面有乙個(b[i]+1),當b[i]=max(b[i])時該值最大 所以最短路應當以max(b[i])為原點進行
由題意,在i至i+1區間中,最多選1個數,最少選0個數
於是得到0<=d[i+1]-d[i]<=1 所以同理我們將(i,i-1,0,)以及(i-1,i,1)連邊
最後算出d[max(b[i])]即可
上**
#include#include#include
using
namespace
std;
int n,head[50050],num,a[50050],b[50050],c[50050],d[50050],vst[50050
];struct
edge
e[200050
];void add(int u,int v,int
c)void spfa(int
x) }
}}int
main()
for(int i=1;i<=m;i++)
//for(int i=1;i<=m;i++)
//add(50005,i,0);
//for(int i=1;i<=num;i++)
//printf("%d %d\n",e[i].u,e[i].v);
spfa(m);
int minn=0x3f3f3f3f
;
//for(int i=1;i<=m;i++)minn=min(minn,d[i]);
printf("
%d",-d[0]/*
-minn
*/);
return0;
}
2019暑假集訓
7.8 題解a.類似於保護古蹟的亂搞 b.可持久化線段樹維護塊與塊的連邊 暴力匹配 c.burnside引理好題 補不來.jpg ctsc2014 隨機數 這裡 感覺是一道比較好的題 常見套路又忘了系列 n個點無向連通圖計數 考慮1號點所在聯通塊大小 減掉 然後得到乙個柿子可以分治fft 7.9題解...
2019暑假集訓心得
暑假終於要過去了在學校訓練了乙個月。感覺進步不是很明顯,但是總的來說還是有很多收穫的。我上大學的最愛的東西有兩件,乙個是女朋友,乙個是acm。我知道我第一次談戀愛不會太長久,所以我很珍惜和她在一起的時間,為她也主動放棄了很多東西,每一天我都很努力的愛她,如今走到這步田地,我也沒啥好後悔的。現在既然只...
總結 2019暑假集訓
啊,我最喜歡的暑假集訓終究還是結束了。感覺集訓收穫的還是挺大的,不管是在知識方面還是心態方面,感覺現在考試心態穩了很多,不管是考前考時考後,都可以很快的調整了。大概就是教練所說的考試心態調整的加速。最近感覺非常好,雖然水題還是老爆零,考得也不怎麼樣,不過我的確是飛快的在進步了,只要我在進步就好了,我...