社区讨论

水题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 条回复,欢迎继续交流。

正在加载回复...