MLE求调
查看原帖
MLE求调
589600
AH20楼主2022/7/5 21:14

不知道为什么MLE了五个点,求大佬帮忙看一下问题出在哪里

#include <bits/stdc++.h>
using namespace std;
using ll = int;
const int MAXN = 5e4 + 5;
struct node{
   ll l,r,maxx;
};
//权值线段树维护区间最值
ll  mark[MAXN << 2], n, m, A[MAXN];
map<ll,ll>LOC;
set<ll>st;
node tree[MAXN<<2];
void build(int p = 1, int cl = 1, int cr = n)
{
    if (cl == cr) {tree[p].maxx=A[cl],tree[p].l=tree[p].r=cr;return;}
    int mid = (cl + cr) >> 1;
    build(p << 1, cl, mid);
    build(p << 1 | 1, mid + 1, cr);
    tree[p].l=tree[p<<1].l;
    tree[p].r=tree[p<<1|1].r;
    tree[p].maxx = max(tree[p << 1].maxx , tree[p << 1 | 1].maxx);
}
ll query(int l, int r, int p = 1, int cl = 1, int cr = n)
{
    if (cl >= l && cr <= r) return tree[p].maxx;
    ll mid = (cl + cr) >> 1, ans = 0;
    if (mid >= l) ans =max(ans, query(l, r, p << 1, cl, mid));
    if (mid < r) ans =max(ans, query(l, r, p << 1 | 1, mid + 1, cr));
    return ans;
}
int main()
{
    scanf("%d",&n);
   for(int i=1;i<=n;i++){
     ll year;
      scanf("%d",&year);
      st.insert(year);
      LOC[year]=i;
      scanf("%d",&A[i]);
   }
    build();
    //cout<<query(2,1)<<endl;
    scanf("%d",&m);
    while (m--)
    {
        ll L,R;
        scanf("%d%d",&L,&R);
        ll LL=LOC[L];
        ll RR=LOC[R];
        ll MAX=query(LL+1,RR-1);
        if(RR==0){
            puts("maybe");
            continue;
        }
        else if(LL==0){
           // L=*st.lower_bound(L);
           auto it=st.lower_bound(L);
           if(it==st.end()) it--;
           L=*it;
            LL=LOC[L];
            ll MAX=query(LL+1,RR-1);
            if(MAX<A[RR]) puts("maybe");
            else puts("false");
            continue;
        }
        if(MAX<A[RR]&&A[RR]<A[LL]){
            if(RR-LL==R-L) puts("true");
            else puts("maybe");
        }
        else puts("false");
    }
    return 0;
}
/*
6
-2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
1
2004 -2002
*/

2022/7/5 21:14
加载中...