ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【SCOI2007】降雨量

2019-12-17 23:50:42  阅读:314  来源: 互联网

标签:降雨量 return int else printf false SCOI2007


新人求助,降雨量那题本机AC提交WAWAWA……

原题:

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

1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9

 

以前的博客说这题没啥思维难度,难就难在细节讨论

这次写信心爆棚认为老子现在问题处理地多棒,只需转化某些要点的表达方式就可以避免讨论

然后……

 

 行吧,这次是我被练了

 

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int oo=1000000007;
 5 int n,a[51000],b[51000],m;
 6 int v[210000];  bool u[210000];
 7 void gtsgmttr(int x,int l,int r){
 8     if(l==r){
 9         v[x]=b[l],u[x]=false;
10         return ;
11     }
12     int md=(l+r)>>1;
13     gtsgmttr(x<<1,l,md),gtsgmttr(x<<1|1,md+1,r);
14     v[x]=max(v[x<<1],v[x<<1|1]);
15     u[x]=(u[x<<1]|u[x<<1|1]|(a[md]+1!=a[md+1]));
16 }
17 int qrv(int x,int l,int r,int ql,int qr){
18     if(l==ql && r==qr)  return v[x];
19     int md=(l+r)>>1;
20     if(ql<=md && qr>md)
21         return max(qrv(x<<1,l,md,ql,md),qrv(x<<1|1,md+1,r,md+1,qr));
22     else if(qr<=md)  return qrv(x<<1,l,md,ql,qr);
23     else  return qrv(x<<1|1,md+1,r,ql,qr);
24 }
25 bool qru(int x,int l,int r,int ql,int qr){
26     if(l==ql && r==qr)  return u[x];
27     int md=(l+r)>>1;
28     if(ql<=md && qr>md)
29         return (qru(x<<1,l,md,ql,md)|qru(x<<1|1,md+1,r,md+1,qr)|(a[md]+1!=a[md+1]));
30     else if(qr<=md)  return qru(x<<1,l,md,ql,qr);
31     else  return qru(x<<1|1,md+1,r,ql,qr);
32 }
33 int bnrsch(int x){  //如果找不到默认输出左侧的
34     int l=0,r=n,md;
35     //int l=1,r=n,md;
36     //如果l初值为1,则若左端点小于最小值,那么实际返回的是右侧的
37     while(l+1<r){
38         md=(l+r)>>1;
39         (a[md]<x ? l : r)=md;
40     }
41     //return (a[l]!=x && a[r]!=x ? -1 : (a[l]==x ? l : r));
42     return a[r]==x ? r : l;
43 }
44 int main(){
45     freopen("ddd.in","r",stdin);
46     cin>>n;
47     for(int i=1;i<=n;++i)  scanf("%d%d",&a[i],&b[i]);
48     gtsgmttr(1,1,n);
49     cin>>m;
50     int l,r,x,y;
51     while(m --> 0){
52         scanf("%d%d",&x,&y);
53         l=bnrsch(x),r=bnrsch(y);
54         if(x>=y+1)  printf("false\n");
55         //else if(a[r]!=y || a[l]!=x)  printf("maybe\n");
56         if(a[l]!=x && a[r]!=y)  printf("maybe\n");
57         else if(a[l]!=x || a[r]!=y){
58             //注意如果两个端点只知道一个也是能判必错的
59             int tmp=(l+1<=r-(a[r]==y) ? qrv(1,1,n,l+1,r-(a[r]==y)) : 0);
60             if(a[l]!=x ? b[r]<=tmp : b[l]<=tmp)  printf("false\n");
61             else printf("maybe\n");
62         }
63         else if(b[r]>b[l])  printf("false\n");
64         else{
65             int tmp=(l+1<=r-1 ? qrv(1,1,n,l+1,r-1) : 0);
66             if(b[r]<=tmp)  printf("false\n");
67             else if(qru(1,1,n,l,r))  printf("maybe\n");
68             else  printf("true\n");
69         }
70     }
71     return 0;
72 }
View Code

标签:降雨量,return,int,else,printf,false,SCOI2007
来源: https://www.cnblogs.com/cdcq/p/12057643.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有