• 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;
    }


  • 相关阅读:
    Overloaded的方法是否可以改变返回值的类型
    parseXXX的用法
    java的类型转换问题。int a = 123456;short b = (short)a;System.out.println(b);为什么结果是-7616?
    UVA 10405 Longest Common Subsequence(简单DP)
    POJ 1001 Exponentiation(大数处理)
    POJ 2318 TOYS(计算几何)(二分)
    POJ 1265 Area (计算几何)(Pick定理)
    POJ 3371 Flesch Reading Ease (模拟题)
    POJ 3687 Labeling Balls(拓扑序列)
    POJ 1094 Sorting It All Out(拓扑序列)
  • 原文地址:https://www.cnblogs.com/keshuqi/p/5957708.html
Copyright © 2020-2023  润新知