只有两个点AC
查看原帖
只有两个点AC
1220130
520_forever_love_you楼主2024/8/18 23:47

求调代码,每个样例多测中大部分的输出答案都正确,仅有极个别输出不一致,但导致一共只通过22个测试点。

例如样例输出为:

yumi!
yumi!
28
24
28
yumi!

我的输出为:

yumi!
yumi!
28
26
28
yumi!

以下为代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ull unsigned long long 
#define il inline

const int MAXN = 500010;
const int M = MAXN * 30;
ll n,q,m,tot;
int a[MAXN], t[MAXN];
int T[M], lson[M], rson[M], c[M];
 
void Init_hash(){
    for(int i = 1; i <= n; i++)  t[i] = a[i];
    sort(t+1,t+1+n);
    m = unique(t+1,t+1+n)-t-1;
}

int build(int l,int r){
    int root = tot++;
    c[root] = 0;
    if(l != r){
        int mid = (l+r)>>1;
        lson[root] = build(l,mid);
        rson[root] = build(mid+1,r);
    }
    return root;
}

int Hash(int x){
    return lower_bound(t+1, t+1+m, x) - t;
}

int update(int root, int pos, int val){
    int newroot = tot++, tmp = newroot;
    c[newroot] = c[root] + val;
    int l = 1, r = m;
    while(l < r){
        int mid = (l+r) >> 1;
        if(pos <= mid){
            lson[newroot] = tot++; 
            rson[newroot] = rson[root];
            newroot = lson[newroot]; 
            root = lson[root];
            r = mid;
        }
        else{
            rson[newroot] = tot++; 
            lson[newroot] = lson[root];
            newroot = rson[newroot]; 
            root = rson[root];
            l = mid + 1;
        }
        c[newroot] = c[root] + val;
    }
    return tmp;
}

int query(int left_root, int right_root, int k){
    int l = 1, r = m;
    while(l < r){
        int mid = (l+r) >> 1;
        if(c[lson[left_root]]-c[lson[right_root]] >= k){
            r = mid;
            left_root = lson[left_root];
            right_root = lson[right_root];
        }
        else{
            l = mid + 1;
            k -= c[lson[left_root]] - c[lson[right_root]];
            left_root = rson[left_root];
            right_root = rson[right_root];
        }
    }
    return l;
}

void reading(int &ret){
    ret=0;
    char ch=getchar();
    int flag=1;
    while(ch>'9'||ch<'0'){if(ch=='-') flag=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){
        ret=ret*10+ch-'0';
        ch=getchar();
    }
    ret*=flag;
}

signed main(){
    while(~scanf("%lld%lld", &n, &q)){
        for (int i = 1; i <= n; i++)  reading(a[i]);
        tot=0;
        Init_hash();
        T[n + 1] = build(1, m);
        for (int i = n; i; i--){
            int pos = Hash(a[i]);
            T[i] = update(T[i + 1], pos, 1);
        }
        while (q--) {
            int l, r;
            reading(l), reading(r);
            int len = 1;
            ll ans = -1;
            while (len <= (r - l - 1)) {
                ll x1 = t[query(T[l], T[r + 1], len)];
                ll x2 = t[query(T[l], T[r + 1], len + 1)];
                ll x3 = t[query(T[l], T[r + 1], len + 2)];
                if (x3 < x2 + x1 && x3 > x2 - x1) {
                    ans = 1ll * x1 + 1ll * x2 + 1ll * x3;
                    break;
                }
                len++;
            }
            if(ans == -1)    cout << "yumi!" << '\n';
            else    printf("%lld\n", ans);
        }
    }
    return 0;
}
2024/8/18 23:47
加载中...