BZOJ1067:[SCOI2007]降雨量
阿新 • • 發佈:2019-01-07
淺談\(RMQ\):https://www.cnblogs.com/AKMer/p/10128219.html
題目傳送門:https://lydsy.com/JudgeOnline/problem.php?id=1067
關於\(RMQ\)的部分應該是很裸的了,這題難在分類討論上。
模擬題不難的。
時間複雜度:\(O(nlogn+m)\)
空間複雜度:\(O(nlogn)\)
程式碼如下:
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; const int maxn=5e4+11; int n,m; int f[17][maxn]; int year[maxn],rain[maxn],Log[maxn]; int read() { int x=0,f=1;char ch=getchar(); for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0'; return x*f; } void make_st() { Log[0]=-1; for(int i=1;i<=n;i++) Log[i]=Log[i>>1]+1; for(int i=1;i<17;i++) for(int j=1;j+(1<<i)-1<=n;j++) f[i][j]=max(f[i-1][j],f[i-1][j+(1<<(i-1))]); } int query(int l,int r) { if(r<l)return 0; int x=Log[r-l+1]; return max(f[x][l],f[x][r-(1<<x)+1]); } int main() { n=read(); for(int i=1;i<=n;i++) year[i]=read(),f[0][i]=rain[i]=read(); make_st();m=read(); for(int i=1;i<=m;i++) { int y=read(),x=read(); int posy=lower_bound(year+1,year+n+1,y)-year; int posx=lower_bound(year+1,year+n+1,x)-year; int mx=query(posy+(year[posy]==y),posx-1); if(year[posy]!=y&&year[posx]!=x) {puts("maybe");continue;} if(year[posy]==y&&year[posx]!=x) { if(mx>=rain[posy]) {puts("false");continue;} else {puts("maybe");continue;} } if(year[posy]!=y&&year[posx]==x) { if(mx>=rain[posx]) {puts("false");continue;} else {puts("maybe");continue;} } if(year[posy]==y&&year[posx]==x) { if(rain[posy]<rain[posx]||mx>=rain[posx]) {puts("false");continue;} else if(x-y!=posx-posy) {puts("maybe");continue;} else {puts("true");continue;} } } return 0; }