社区讨论

90 ? 求助

P2471[SCOI2007] 降雨量参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lryicix7
此快照首次捕获于
2024/01/29 13:47
2 年前
此快照最后确认于
2024/01/29 14:07
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
int st_max[1000010][40],Log2[1000010],n,m,x,y;
struct node{
	int year;
	int rain;
}a[1000010];
map<int,int>ma;
int work(int l,int r){
//	if(l>r)swap(l,r); 
	int k=Log2[r-l+1];
	return max(st_max[l][k],st_max[r-(1<<k)+1][k]);
}
int find(int target){
	int l=1,r=n,mid;
	while(l<r){
		mid=(l+r+1)>>1;
		if(a[mid].year<=target)l=mid;
		else r=mid-1;
	}
	return l;
}
int find2(int target){
	int l=1,r=n,mid;
	while(l<r){
		mid=(l+r)>>1;
		if(a[mid].year>=target)r=mid;
		else l=mid+1;
	}
	return l;
}
signed main(){
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
	Log2[1]=0;
	for(int i=2;i<=200001;i++)Log2[i]=Log2[i>>1]+1;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].year>>a[i].rain;
		ma[a[i].year]=i;
		st_max[i][0]=a[i].rain;
	}
	for(int j=1;j<=Log2[n];j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			st_max[i][j]=max(st_max[i][j-1],st_max[i+(1<<(j-1))][j-1]);
		}
	}
//	int tmp;
//	cin>>tmp;
//	cout<<find2(tmp);
	cin>>m;
	while(m--){
		cin>>y>>x;
		int posx=ma[x],posy=ma[y];
		if(posx && posy){
			if(a[posx].rain>a[posy].rain){
				puts("false");
			}
			else if(work(posy+1,posx-1)>=a[posx].rain && posy!=posx-1){
				puts("false");
			}
			else if(posx-posy<x-y){
				puts("maybe");
			}
			else{
				puts("true");
			}
		}	
		else if(posx==0 && posy){
			if(work(posy+1,find(x))>a[posy].rain && posy!=find(x)){
				puts("false");
			}
			else puts("maybe");
		}
		else if(posx && posy==0){
			if(work(find2(y),posx-1)>=a[posx].rain && find2(y)!=posx){
				puts("false");
			}
			else puts("maybe");
		}
		else{
			puts("maybe");
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...