• BZOJ 1067: [SCOI2007]降雨量


    1067: [SCOI2007]降雨量

    Time Limit: 1 Sec  Memory Limit: 162 MB

    Submit: 5620  Solved: 1474

    [Submit][Status][Discuss]

    Description

      我们常常会说这样的话:“X年是自Y年以来降雨量最多的”。它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年。例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说“2005年是自2003年以来最多的”,但不能说“2005年是自2002年以来最多的”由于有些年份的降雨量未知,有的说法是可能正确也可以不正确的。

    Input

      输入仅一行包含一个正整数n,为已知的数据。以下n行每行两个整数yi和ri,为年份和降雨量,按照年份从小到大排列,即yi<yi+1。下一行包含一个正整数m,为询问的次数。以下m行每行包含两个数Y和X,即询问“X年是自Y年以来降雨量最多的。”这句话是必真、必假还是“有可能”。

    Output

      对于每一个询问,输出true,false或者maybe。

    Sample Input

    6
    2002 4920
    2003 5901
    2004 2832
    2005 3890
    2007 5609
    2008 3024
    5
    2002 2005
    2003 2005
    2002 2007
    2003 2007
    2005 2008

    Sample Output

    false
    true
    false
    maybe
    false

    HINT

    100%的数据满足:1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9

    Source

    POJ 2637 WorstWeather Ever

    题解

    直接离散化然后线段树维护区间最值,讨论各种情况即可。

    代码

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iostream>
    #define lson u<<1,l,mid
    #define rson u<<1|1,mid+1,r
    using namespace std;
    const int N=500005;
    int n,m;
    int t[N],y[N],a[N],mx[N<<4];
    void pushup(int u){
    	mx[u]=max(mx[u<<1],mx[u<<1|1]);
    }
    void build(int u,int l,int r){
    	if(l==r){
    		mx[u]=a[l];
    		return;
    	}
    	int mid=(l+r)>>1;
    	build(lson);
    	build(rson);
    	pushup(u);
    }
    int query(int u,int l,int r,int a,int b){
    	if(a<=l&&r<=b)return mx[u];
    	int ret=0;
    	int mid=(l+r)>>1;
    	if(a<=mid)ret=max(ret,query(lson,a,b));
    	if(b>mid)ret=max(ret,query(rson,a,b));
    	return ret;
    }
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++){
    		scanf("%d%d",&y[i],&a[i]);
    		t[i]=y[i];
    	}
    	sort(t+1,t+n+1);
    	for(int i=1;i<=n;i++){
    		y[i]=lower_bound(t+1,t+n+1,y[i])-t;
    	}
    	build(1,1,n);
    	scanf("%d",&m);
    	int x,y,tx,ty;
    	for(int i=1;i<=m;i++){
    		scanf("%d%d",&y,&x);
    		tx=upper_bound(t+1,t+n+1,x)-t-1;
    		ty=lower_bound(t+1,t+n+1,y)-t;
    		if(t[tx]!=x&&t[ty]!=y)printf("maybe
    ");
    		else if(t[ty]!=y){
    			if(tx==ty)printf("maybe
    ");
    			else if(query(1,1,n,ty,tx-1)<a[tx])printf("maybe
    ");
    			else printf("false
    ");
    		}
    		else if(t[tx]!=x){
    			if(tx==ty)printf("maybe
    ");
    			else if(query(1,1,n,ty+1,tx)<a[ty])printf("maybe
    ");
    			else printf("false
    ");
    		}
    		else if(t[tx]==x&&t[ty]==y){
    			if(a[tx]<=a[ty]&&tx==ty+1){
    				if(tx-ty!=x-y)printf("maybe
    ");
    				else printf("true
    ");
    			}
    			else if(a[tx]<=a[ty]&&query(1,1,n,ty+1,tx-1)<a[tx]){
    				if(tx-ty!=x-y)printf("maybe
    ");
    				else printf("true
    ");
    			}
    			else printf("false
    ");
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    【LeetCode】N数和
    用PHP写一个双向队列
    PHP的几种遍历方法
    thinkphp中dump()方法
    【转】PHP对象在内存中的分配
    【转】PHP的执行原理/执行流程
    从头到尾彻底解析哈希表算法
    【转】TCP通信的三次握手和四次撒手的详细流程(顿悟)
    springmvc中拦截器的定义和配置
    springmvc中的异常处理方法
  • 原文地址:https://www.cnblogs.com/chezhongyang/p/7745896.html
Copyright © 2020-2023  润新知