【Noip模擬 20160929】劃區灌溉
阿新 • • 發佈:2019-03-24
xmlns cout urn ont 愛的 不知道說什麽 mat pre min
題目描述
約翰的奶牛們發現山脊上的草特別美味。為了維持草的生長,約翰打算安裝若幹噴灌器。
為簡化問題,山脊可以看成一維的數軸,長為L(1≤L≤1,000,000)L(1≤L≤1,000,000),而且L一定是一個偶數。每個噴灌器可以雙向噴灌,並有確定的射程,該射程是一個整數,且不短於AA,不長於BB。A,B(1≤A≤B≤1000)A,B(1≤A≤B≤1000)都是給出的正整數。它所在位置的兩邊射程內,都屬它的灌溉區域。現要求山脊的每一個區域都被灌溉到,而且噴灌器的灌溉區域不允許重疊。
約翰有N(1≤N≤1000)N(1≤N≤1000)只奶牛,每一只都有特別喜愛的草區,第i只奶牛的草區是 [Si,Ei][Si,Ei],不同奶牛的草區可以重疊。現要求,每只奶牛的草區僅被一個噴灌器灌溉。尋找最少需要的噴灌器數目。
輸入數據
第11行:N,LN,L.
第22:A,BA,B.
第33到N+2N+2行:每行22個整數Si,Ei,0≤S<E≤LSi,Ei,0≤S<E≤L.
輸出數據
最小的噴灌器數目。如果無法設計出滿足條件的噴灌器數目,請輸出−1−1.
樣例輸入
2 8
1 2
6 7
3 6
樣例輸出
3
`
樣例說明
如下圖,只需安裝三個噴灌器。c1,c2c1,c2為奶牛們的草區。
|-----c2----|-c1| |---1---|-------2-------|---3---| +---+---+---+---+---+---+---+---+ 0 1 2 3 4 5 6 7 8
數據範圍
對於30%30%的數據,L≤100L≤100。
對於60%60%的數據,L≤10000L≤10000。
對於100%100%的數據,1≤L≤1,000,000,1≤A≤B≤1000,1≤N≤10001≤L≤1,000,000,1≤A≤B≤1000,1≤N≤1000。
題目分析
這道題我覺得我這輩子都AC不了了,其實就是在deque上面跑一遍單調就可以了。
好吧我其實AC了,代碼如下:
#include<bits/stdc++.h> using namespace std; #define int long long #defineinf 1999999999 int n,l,a,b,f[1000010]; bitset<1000010>vis; deque<int> q; signed main(){ freopen("divide.in","r",stdin),freopen("divide.out","w",stdout); cin>>n>>l>>a>>b; for (int i=1,s,e;i<=n;++i) { cin>>s>>e; for (int j=s+1;j<e;++j) vis[j]=1; }for (int i=1; i<=l; ++i) { f[i]=inf; while(!q.empty()&&q.front()<i-2*b) q.pop_front(); if(!vis[i]&&i%2==0&&!q.empty()) f[i]=min(f[i],f[q.front()]+1); if(i-2*a+1>=0&&!vis[i-2*a+1]&&(i-2*a+1)%2==0){ while(!q.empty()&&f[i-2*a+1]<f[q.back()]) q.pop_back(); q.push_back(i-2*a+1); }}if (f[l]!=inf) cout<<f[l]; else cout<<-1; return 0; }
代碼說明
不知道說什麽好,過幾次我講一講我和她的故事。
【Noip模擬 20160929】劃區灌溉