1. 程式人生 > >【Noip模擬 20160929】劃區灌溉

【Noip模擬 20160929】劃區灌溉

xmlns cout urn ont 愛的 不知道說什麽 mat pre min

題目描述

約翰的奶牛們發現山脊上的草特別美味。為了維持草的生長,約翰打算安裝若幹噴灌器。

為簡化問題,山脊可以看成一維的數軸,長為L(1L1,000,000)L(1≤L≤1,000,000),而且L一定是一個偶數。每個噴灌器可以雙向噴灌,並有確定的射程,該射程是一個整數,且不短於AA,不長於BB。A,B(1AB1000)A,B(1≤A≤B≤1000)都是給出的正整數。它所在位置的兩邊射程內,都屬它的灌溉區域。現要求山脊的每一個區域都被灌溉到,而且噴灌器的灌溉區域不允許重疊。

約翰有N(1N1000)N(1≤N≤1000)只奶牛,每一只都有特別喜愛的草區,第i只奶牛的草區是

[SiEi][Si,Ei],不同奶牛的草區可以重疊。現要求,每只奶牛的草區僅被一個噴灌器灌溉。尋找最少需要的噴灌器數目。

輸入數據

11行:N,LN,L.

22:A,BA,B.

33到N+2N+2行:每行22個整數Si,Ei,0S<ELSi,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%的數據,L100L≤100。

對於60%60%的數據,L10000L≤10000。

對於100%100%的數據,1L1,000,0001AB10001N10001≤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
#define
inf 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】劃區灌溉