码迷,mamicode.com
首页 > 其他好文 > 详细

【SCOI2007】降雨量

时间:2019-12-18 00:15:16      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:新人   idt   提交   main   als   问题处理   freopen   while   pre   

新人求助,降雨量那题本机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

【SCOI2007】降雨量

标签:新人   idt   提交   main   als   问题处理   freopen   while   pre   

原文地址:https://www.cnblogs.com/cdcq/p/12057643.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!