抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

问每次询问,Y与X,是否满足X是自Y以来最大降雨量的一年。

这题可以用ST表做。首先对年份进行离散化处理,数字相邻的离散化后的数字也相邻,但是中间有数字空白的,离散化时要差1位。

之后初始化st表,建立stmax和stmin两部分,某个区间的最小值为0,说明这个区间存在不确定的年份,这个是判maybe的一个关键条件。

之后只需要判断X与Y的关系,以及X与[Y+1, X-1]区间的最大值的关系。

注意:X需要小于等于Y,[Y+1, X-1]的每一个数也要满足这个条件,题干虽然没说但根据不等式也能推导出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef VLSMB_VS
#include <bits/stdc++.h>
#else
#include <iostream>
#include <iomanip>
#include <set>
#include <algorithm>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#endif

#define int long long
#define pii pair<int,int>
#define endl '\n'
#define veci vector<int>
#define vecpi vector<pii >
#define mpi map<int,int>
#define mpc map<char,int>
#define inf 0x7fffffffffffffff
#define yes cout<<"yes"<<endl
#define no cout<<"no"<<endl
#define seti set<int>
#define mulseti multiset<int>
#define setpi set<pii >
#define priqli priority_queue<int,veci,less<int> >
#define priqgi priority_queue<int,veci,greater<int> >
using namespace std;
const int N = 1e5;
void solve();
void init();
int logn[N];

signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t=1;
init();
//cin>>t;
while(t--)solve();
cout.flush();
return 0;
}
int stmax[N][20],stmin[N][20];

void solve()
{
int n,m;
cin>>n;
int idx=1,last=0;
mpi h;
int x,y,r;
veci year;
for(int i=0;i<n;i++)
{
cin>>y>>r;
year.push_back(y);
if(i&&y-last>1)idx++;
last=y;
h[y]=idx++;
stmax[h[y]][0]=r;
}
n=idx;
for(int i=1;i<=n;i++)stmin[i][0]=stmax[i][0];

for(int j=1;j<20;j++)
{
for(int i=1;i<=n&&(i+(1<<(j-1)))<=n;i++)
{
stmax[i][j]=max(stmax[i][j-1],stmax[i+(1<<(j-1))][j-1]);
stmin[i][j]=min(stmin[i][j-1],stmin[i+(1<<(j-1))][j-1]);
}
}
cin>>m;
while(m--)
{
cin>>y>>x;
if(y>=x)
{
cout<<"false"<<endl;
continue;
}
//x=h[x],y=h[y];
auto p = lower_bound(year.begin(),year.end(),x);
if(p==year.end())
{
p--;
x=h[*p]+1;
}
else if(*p==x)x=h[*p];
else x=h[*p]-1;
p = lower_bound(year.begin(),year.end(),y);
if(p==year.end())
{
p--;
y=h[*p]+1;
}
else if(*p==y)y=h[*p];
else y=h[*p]-1;

int s=logn[x-1-(y+1)+1];
if(x-y<=1)
{
if(!stmax[x][0]||!stmax[y][0])cout<<"maybe"<<endl;
else if(stmax[x][0]<stmax[y][0])cout<<"true"<<endl;
else cout<<"false"<<endl;
continue;
}

if(!stmax[x][0]||!stmax[y][0])
{
if(!stmax[x][0])
{
// 注意不等式的传递!
if(stmax[y][0]&&max(stmax[y+1][s],stmax[x-1-(1<<s)+1][s])>=stmax[y][0])cout<<"false"<<endl;
else cout<<"maybe"<<endl;
}
else
{
if(stmax[x][0]>max(stmax[y+1][s],stmax[x-1-(1<<s)+1][s]))
{
cout<<"maybe"<<endl;
}
else cout<<"false"<<endl;
}
}
else if(stmax[x][0]<=stmax[y][0])
{
if(stmax[x][0]>max(stmax[y+1][s],stmax[x-1-(1<<s)+1][s]))
{
if(!min(stmin[y+1][s],stmin[x-1-(1<<s)+1][s]))cout<<"maybe"<<endl;
else cout<<"true"<<endl;
}
else cout<<"false"<<endl;
}
else cout<<"false"<<endl;
}
}
void init()
{
logn[1]=0;
logn[2]=1;
for(int i=3;i<N;i++)logn[i]=logn[i/2]+1;
}