[BZOJ1067/Luogu2471][SCOI2007]降雨量
阿新 • • 發佈:2018-12-20
沒有 href 降雨量 als php 預處理 else if else rain
表,好寫,常數小。
題目鏈接:
BZOJ1067
Luogu2471
來了來了,BZOJ著名題目
\(Juruo\)少有的\(1A\)
很明顯的一個分類討論題,分以下\(5\)中情況來討論。
設\(l,r\)為詢問的兩個年份,\(Rain_i\)表示\(i\)年的雨量。
\(1.\)答案為\(true\)
\(Rain_l\sim Rain_r\)已知
\(Rain_r<Rain_l\)
\(Rain_r>\max\{Rain_{l+1}\sim Rain_{r-1}\}\)
\(2.\)答案為\(false\)的一種:\(Rain_l,Rain_r\)已知
- \(Rain_r\ge Rain_l\)
- \(Rain_r\ge Rain_l\)
\(3.\)答案為\(false\)的一種:\(Rain_l\)已知
- \(Rain_l-\max\{Rain_{l+1}\sim Rain_{r-1}\}\le 2\)(沒有足夠的空隙留給\(Rain_r\))
\(4.\)答案為\(false\)的一種:\(Rain_r\)已知
- \(Rain_r\le \max\{Rain_{l+1}\sim Rain_{r-1}\}\)
- \(5.\)其他情況均為\(maybe\)
真簡單
關於\(\max\)查詢我用的\(ST\)
#include <cstdio> #include <algorithm> int n,m; int Year[50005],Rain[50005]; int Log[50005],f[50005][17]; inline int Max(int l,int r) { if(l>r)return -1; int k=Log[r-l+1]; return std::max(f[l][k],f[r-(1<<k)+1][k]); } int main() { scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%d%d",&Year[i],&Rain[i]); for(int i=1;i<=n;++i)f[i][0]=Rain[i]; for(int i=2;i<=n;++i)Log[i]=Log[i>>1]+1;//預處理Log for(int k=1;(1<<k)<=n;++k) for(int i=1;i+(1<<k)-1<=n;++i) f[i][k]=std::max(f[i][k-1],f[i+(1<<(k-1))][k-1]); scanf("%d",&m); for(int l,r;m--;) { scanf("%d%d",&l,&r); int p1=std::lower_bound(Year+1,Year+n+1,l)-Year; int p2=std::lower_bound(Year+1,Year+n+1,r)-Year; if(Year[p1]==l&&Year[p2]==r&&p2-p1==r-l&&Rain[p2]<Rain[p1]&&Rain[p2]>Max(p1+1,p2-1)) puts("true"); else if(Year[p1]==l&&Year[p2]==r&&(Rain[p2]>=Rain[p1]||Rain[p2]<=Max(p1+1,p2-1))) puts("false"); else if(Year[p1]==l&&Year[p2]!=r&&Rain[p1]-Max(p1+1,p2-1)<2) puts("false"); else if(Year[p1]!=l&&Year[p2]==r&&Rain[p2]<=Max(p1,p2-1)) puts("false"); else puts("maybe"); } return 0; }
\(Upadte:\)似乎很多人沒有考慮第\(3\)種情況?
[BZOJ1067/Luogu2471][SCOI2007]降雨量