1067: [SCOI2007]降雨量 - BZOJ
Description
我們常常會說這樣的話:“X年是自Y年以來降雨量最多的”。它的含義是X年的降雨量不超過Y年,且對于任意Y<Z<X,Z年的降雨量嚴(yán)格小于X年。例如2002,2003,2004和2005年的降雨量分別為4920,5901,2832和3890,則可以說“2005年是自2003年以來最多的”,但不能說“2005年是自2002年以來最多的”由于有些年份的降雨量未知,有的說法是可能正確也可以不正確的。
Input
輸入僅一行包含一個正整數(shù)n,為已知的數(shù)據(jù)。以下n行每行兩個整數(shù)yi和ri,為年份和降雨量,按照年份從小到大排列,即yi<yi+1。下一行包含一個正整數(shù)m,為詢問的次數(shù)。以下m行每行包含兩個數(shù)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%的數(shù)據(jù)滿足:1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9
?
?
其實(shí)不難,只不過容易漏掉某些情況
用倍增或者線段樹求最值
比如說第X年不確定時,第Y年降雨量必須大于中間的降雨量
直接分四種大情況,然后討論,就很清晰了
1.X,Y都確定
2.X,Y都不確定
3.X確定,Y不確定
4.X不確定,Y確定
1 const 2 maxn=50010; 3 var 4 f:array[0..maxn,0..20]of longint; 5 a,b:array[0..maxn]of longint; 6 n,m:longint; 7 8 function max(x,y:longint):longint; 9 begin 10 if x>y then exit(x); 11 exit(y); 12 end; 13 14 function findl(x:longint):longint; 15 var 16 l,r,mid:longint; 17 begin 18 l:=1; 19 r:=n; 20 while l<>r do 21 begin 22 mid:=(l+r)>>1; 23 if a[mid]>=x then r:=mid 24 else l:=mid+1; 25 end; 26 exit(l); 27 end; 28 29 function findr(x:longint):longint; 30 var 31 l,r,mid:longint; 32 begin 33 l:=1; 34 r:=n; 35 while l<>r do 36 begin 37 mid:=(l+r+1)>>1; 38 if a[mid]<=x then l:=mid 39 else r:=mid-1; 40 end; 41 exit(l); 42 end; 43 44 function ans(l,r:longint):longint; 45 var 46 k:longint; 47 begin 48 if l>r then exit(0); 49 k:=0; 50 while 1<<(k+1)<r-l+1 do 51 inc(k); 52 exit(max(f[l,k],f[r-1<<k+1,k])); 53 end; 54 55 procedure init; 56 var 57 i,j,k:longint; 58 begin 59 read(n); 60 for i:=1 to n do 61 begin 62 read(a[i],b[i]); 63 f[i,0]:=b[i]; 64 end; 65 k:=1; 66 j:=1; 67 while k<n do 68 begin 69 for i:=1 to n-k do 70 f[i,j]:=max(f[i,j-1],f[i+k,j-1]); 71 k:=k<<1; 72 inc(j); 73 end; 74 end; 75 76 procedure work; 77 var 78 i,x,y,l,r:longint; 79 begin 80 read(m); 81 for i:=1 to m do 82 begin 83 read(x,y); 84 l:=findl(x); 85 r:=findr(y); 86 if a[l]=x then 87 if a[r]=y then 88 begin 89 if ans(l+1,r-1)<b[r] then 90 if b[l]>=b[r] then 91 if r-l=y-x then writeln('true') 92 else writeln('maybe') 93 else writeln('false') 94 else writeln('false'); 95 end 96 else 97 begin 98 if ans(l+1,r)>=b[l] then writeln('false') 99 else writeln('maybe'); 100 end 101 else 102 if a[r]=y then 103 begin 104 if ans(l,r-1)<b[r] then writeln('maybe') 105 else writeln('false'); 106 end 107 else writeln('maybe'); 108 end; 109 end; 110 111 begin 112 init; 113 work; 114 end. View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/Randolph87/p/3682119.html
總結(jié)
以上是生活随笔為你收集整理的1067: [SCOI2007]降雨量 - BZOJ的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: subShell与代码块
- 下一篇: 关闭rdlc报表打印预览后,关闭客户端,