• bzoj1067 降雨量&&vijos1265 暴风雨


    描述

    话说这日,李逍遥与阿奴正欲前往桃花源拿寿葫芦,突然电闪雷鸣,天降暴雨,弄得两人措手不及,只得到附近的树洞避雨。

    "哎,大理不是本应旱灾的吗?怎么会突降暴雨呢?"李逍遥嘀咕道。

    "大概程序又出bug了吧。"阿奴回答到。(瀑布汗,这绝对是盗版的仙剑)
    "这应该是100年来降雨最多的一次了!"李逍遥感叹。

    "不对。事实上,93年前,从年初到一年的这个时候为止,下的雨是今年的五倍。"
    "哦",李逍遥想了想了,"这么说,这是93年中气候最差的一年。"
    "还是不对,这其实是23年来气候最糟糕的。"阿奴又一次打断他的话。

    ……………………………………………………………………………………
    他们就这样讨论了很长很长时间。

    亲爱的OIers,他们不在乎,你们是在乎的,不是吗?

    若已知大理历史上不同年份的降雨量,现有一系列以"X年是自Y年以来雨量最多的年份"形式给出的陈述,你的任务就是判断这些陈述是正确,可能正确,还是错误的。

    若一个陈述满足下列情况,我们就说它是正确的:
    ·X年和Y年以及这两年间的任意年份的降雨量都是已知的。

    ·X年的降雨量最多不得超过Y年。

    ·对任意年份Z满足Y<Z<X,降雨量都比X年的少。

    当我们用降雨量给年份赋值,却缺少必要的信息来使这个陈述正确,我们说这个陈述可能正确。其他情况下这个陈述是错误的。

    格式

    输入格式

    第一行是一个整数n,表示已知信息中的所含的年份数目。接下来的n行表示每个年份的降雨信息。其中第i行包含两个整数yi,ri(-10^9 <= yi <= 10^9,0 <= ri <= 10^9),表示第yi年的降雨量为ri毫升(注意每年的降雨量可以是一个任意的非负整数,上述范围仅仅是输入信息中数据的范围)。数据保证yi < yi+1 (1 <= i < n)。

    第二部分首先是一个整数m,表示判断的陈述的数目。接下来的m行每行有两个整数Y,X(-10^9 <= Y < X <= 10^9),意义如上所述。

    输出格式

    输出应该包含m行,对应于m个询问。如果陈述为正确的则输出"true"(不含引号,下同),为假则输出"false",可能为真可能为假则输出"maybe"。

    样例1

    样例输入1[复制]

     
    4
    2002 4920
    2003 5901
    2004 2832
    2005 3890
    2
    2002 2005
    2003 2005

    样例输出1[复制]

     
    false
    true

    样例2

    样例输入2[复制]

     
    3
    1985 5782
    1995 3048
    2005 4890
    2
    1985 2005
    2005 2015

    样例输出2[复制]

     
    maybe
    maybe

    限制

    1s

    提示

    40%的输入数据满足 n<=50,m<=10
    80%的输入数据满足 n<=5000,m<=1000
    100%的输入数据满足 n<=50000,m<=10000

    来源

    经典问题

    1591346 ksq2013 1067 Accepted 2196 kb 128 ms C++/Edit 1287 B 2016-08-14 21:57:55

    受教了!

    第一次学zkw线段树(不可谓短小精悍),按标程一步步写的。参考博客:http://www.cnblogs.com/ccz181078/p/5468357.html

    lower_bound()或upper_bound()返回值见博客:http://blog.csdn.net/niushuai666/article/details/6734403

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int inf=0x3f3f3f3f;
    static int M=65536;
    int n,q,x[50001],y[50001],mx[131072];
    inline int read()
    {
    	int x=0,c=getchar(),f=1;
    	while(c>57||c<48){if(c=='-')f=-1;c=getchar();}
    	while(c>47&&c<58)x=x*10+c-48,c=getchar();
    	return x*f;
    }
    inline int query(int l,int r)
    {
    	int sum=-inf;
    	for(l+=M+1,r+=M+3;l^r^1;l>>=1,r>>=1){
    		if(~l&1)sum=max(sum,mx[l^1]);
    		if(r&1)sum=max(sum,mx[r^1]);
    	}
    	return sum;
    }
    int main()
    {
    	n=read();
    	while(n*2+10<M/2)M>>=1;
    	for(int i=0;i<n;i++)
    		x[i]=read(),y[i]=read();
    	x[n]=inf;
    	for(int i=0;i<n;i++)
    		mx[i+M+2]=y[i];
    	for(int i=M-1;i;i--){
    		int l=i<<1,r=l^1;
    		mx[i]=max(mx[l],mx[r]);
    	}
    	q=read();
    	while(q--){
    		int a=read(),b=read();
    		int l=lower_bound(x,x+n,a)-x;
    		int r=upper_bound(x,x+n,b)-x-1;
    		if(a>b){puts("false");continue;}
    		bool lk=x[l]==a,rk=x[r]==b;
    		int Mx=query(l+lk,r-rk);
    		if(lk&&Mx>=y[l]||rk&&Mx>=y[r]||lk&&rk&&y[l]<y[r])
    		{puts("false");continue;}
    		if(r-l==b-a&&lk&&rk&&y[l]>=y[r])
    		{puts("true");continue;}
    		puts("maybe");
    	}
    	return 0;
    }


  • 相关阅读:
    过滤评论中的表情
    谈谈你对多进程,多线程,以及协程的理解
    什么是多线程竞争?
    解释以下什么是锁,有哪几种锁?
    .什么是死锁
    多线程交互访问数据,如果访问到了就不访问了?
    什么是线程安全,什么是互斥锁
    说说下面几个概念:同步,异步,阻塞,非阻塞?
    什么是僵尸进程和孤儿进程?怎么避免僵尸进程?
    python中进程与线程的使用场景
  • 原文地址:https://www.cnblogs.com/keshuqi/p/5957708.html
Copyright © 2020-2023  润新知