BZOJ1067 [SCOI2007]降雨量 RMQ+亂搞

這恐怕是見過最噁心的題目了...

一開始題目意思都理解錯了,然而樣例能過...

總之題解就看hzwer的吧... 

http://hzwer.com/1655.html

區間最值我用的RMQ,當然線段樹也ojbk。。。

代碼可讀性還是有的

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
#define clr(x,i) memset(x,i,sizeof(x))
using namespace std;
const int N=50005,INF=2e9;
int n,q,a[N],w[N],rk[N],ma[N][21],st;
void presolve()
{
	for(int j=1;j<20;j++)
	  for(int i=1;i+(1<<j)-1<=n;i++)
	    ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]);
}
int ask(int l,int r)
{
	if(l>r)return -INF;
	int j=0;
	//while(l+(1<<j)-1<r)j++;
	j=(int)(log(r-l+1)/log(2));
	return max(ma[l][j],ma[r-(1<<j)+1][j]);
}
inline void ans(int f)
{
	if(f<=-1)printf("false\n");
	if(f==0)printf("maybe\n");
	if(f>=1)printf("true\n");
}
void in()
{
	freopen("bzoj1067.in","r",stdin);
 	freopen("bzoj1067.out","w",stdout);
}
int main()
{
	in();
	scanf("%d",&n);
	clr(ma,130);
	for(int i=1;i<=n;i++)
	  scanf("%d%d",&a[i],&w[i]),rk[i]=a[i],ma[i][0]=w[i];
	st=a[1];
	presolve();
	scanf("%d",&q);
	while(q--)
	{
		int be,en,x,y,maxv,f1=1,ff=0,fx=0,fy=0;
		
		scanf("%d%d",&x,&y);
		if(y<=x) {ans(-111);continue;}
		be=lower_bound(a+1,a+n+1,x)-a;
		en=lower_bound(a+1,a+n+1,y)-a;
		if(x!=a[be])
		  fx=1;
		if(y!=a[en])
		  fy=1;
		if(fx&&fy)
		  {ans(0);continue;}
		if(!fx&&a[be+1]-a[be]!=1)ff=1;
		if(!fy&&a[en]-a[en-1]!=1)ff=1;
		if(!fx&&!fy&&en-be!=y-x)ff=1;
		
		if(!fx)
		  maxv=ask(be+1,en-1);
		else if(fx&&!fy)
		  maxv=ask(be,en-1);

		if(!fx&&!fy&&w[be]>=w[en]&&maxv<w[en])
		  if(!ff)
		   {ans(123);continue;}
		  else 
		   {ans(0);continue;}
		else if(!fx&&fy&&maxv<w[be])
		   {ans(0);continue;}
		else if(fx&&!fy&&maxv<w[en])
		   {ans(0);continue;}
		
		ans(-111);
	}
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章