怎么求调里就我一个40分的?
查看原帖
怎么求调里就我一个40分的?
826079
Autumn_Rain楼主2025/7/31 15:00

太难写了,评论区样例也试了不大能理解,求谁指出一下问题。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define For(i,l,r) for(int i=l;i<=r;i++)
int n,q;
const int N=5e4+10;
int y[N],r[N];
void T(){cout<<"true\n";}
void F(){cout<<"false\n";}
void M(){cout<<"maybe\n";}
map<int,int>m;
bool w[N];
int s[N];
//区间max:ST表
int f[N][30];
void init(){
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
		}
	}
}
int qry(int l,int r){
	if(r<l)return -1e18;
	int k=log2(r-l+1);
	return max(f[l][k],f[r-(1<<k)+1][k]);
}
bool chk(int l,int r){
	//y[l]-y[r]之间有没有缺漏年份
	//w[l]-w[r-1]有没有等于1的
	//sigma l<=k<r w[k] >0 return 1 
	if(s[r-1]-s[l-1]>0)return 1;
	else return 0; 
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	For(i,1,n){
		cin>>y[i]>>r[i];
		m[y[i]]=i;
		f[i][0]=r[i];
	}
	init();
	For(i,1,n){
		if(y[i+1]-y[i]!=1){
			w[i]=1;//y[i]后不连续 
		}
	}
	For(i,1,n-1)s[i]=s[i-1]+w[i];
	cin>>q;
	while(q--){
		int a,b;cin>>b>>a;//b<a
		if(a==b+1){T();continue;}
		if(!m[a]){M();continue;}
		if(!m[b]){
			//找离y最近的年份,如果之间max超了就是F
			//否则M
			int id=lower_bound(y+1,y+n+1,b)-y;
			int res=qry(id,m[a]-1);//r[id]-r[m[a]-1]max值 
			if(res>=r[m[a]])F();
			else M();
			continue;
		}
		//a,b都在
		int res=qry(m[b]+1,m[a]-1);//r[m[b]+1]-r[m[a]-1]max 
		if(res>=r[m[a]]){F();continue;} 
		if(chk(m[b],m[a]))M();
		else T();
	}
	return 0;
}


2025/7/31 15:00
加载中...