社区讨论
水题50pts求条闭关
P2471[SCOI2007] 降雨量参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mm33uiqa
- 此快照首次捕获于
- 2026/02/26 14:51 2 周前
- 此快照最后确认于
- 2026/02/26 14:58 2 周前
CPP
#include <bits/stdc++.h>
using namespace std;
map<int,int>mp;
const int maxn = 1e5+100;
int f[maxn][30],lg[maxn],r[maxn],t[maxn];
int n,cnt;
void init(){
for(int i = 2;i<=cnt;i++)lg[i] = lg[i/2]+1;
for(int j = 1;j<=lg[cnt];j++){
for(int i = 1;i+(1<<j)-1<=cnt;i++){
f[i][j] = max(f[i][j-1],f[i+(1<<j-1)][j-1]);
}
}
}
int get(int x,int y){
int len = y-x+1;
return max(f[x][lg[len]],f[y-(1<<lg[len])+1][lg[len]]);
}
int main(){
int m;
cin>>n;
int x,y;
for(int i = 1;i<=n;i++){
cin>>y;
t[i] = y;
mp[y] = ++cnt;
cin>>r[mp[y]];
f[mp[y]][0] = r[mp[y]];
}
init();
cin>>m;
while(m--){
cin>>x>>y;
if(!mp[y]){
cout<<"maybe\n";
continue;
}
if(!mp[x]){
int pos = upper_bound(t+1,t+1+n,x)-t;
x = t[pos];
if(mp[x]+1 < mp[y] && get(mp[x],mp[y]-1)>=r[mp[y]]){
cout<<"false\n";
continue;
}else{
cout<<"maybe\n";
continue;
}
}
if(mp[x]+1 != mp[y] && get(mp[x]+1,mp[y]-1)>=r[mp[y]]){
cout<<"false\n";
continue;
}
if(r[mp[x]]<r[mp[y]]){
cout<<"false\n";
continue;
}
if(y-x+1>mp[y]-mp[x]+1){
cout<<"maybe\n";
continue;
}
cout<<"true\n";
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...