AC了但有大大的疑惑
查看原帖
AC了但有大大的疑惑
654857
Ecaps楼主2024/8/20 14:33

不知道为什么答案总会大 11 ,强行减 11 后竟然AC了。

样例输入

7 5
1 1 3 2 3 4 3
1 3
1 4
3 7
1 7
6 6

样例输出

1
0
3
0
4

我的输出

2
0
4
0
5
#include <bits/stdc++.h>
#define MAXN 500003
using namespace std;
/* FIO */
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
void write(int x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}
/* FIO */
int n,m;
int a[MAXN];
int tot=0; int root[MAXN];
int lson[MAXN<<5],rson[MAXN<<5],sum[MAXN<<5];
int build(int l,int r){
    int rt=++tot;
    sum[rt]=0;
    if (l<r){
        int mid=(l+r)>>1;
        lson[rt]=build(l,mid);
        rson[rt]=build(mid+1,r);
    }
    return rt;
}
int update(int p,int l,int r,int x){
    int rt=++tot;
    sum[rt]=sum[p]+1;
    if (l<r){
        int mid=(l+r)>>1;
        if (x>=mid) {lson[rt]=lson[p]; rson[rt]=update(rson[p],mid+1,r,x);}
        else        {rson[rt]=rson[p]; lson[rt]=update(lson[p],l,mid,x);}
    }
    return rt;
}
struct RES{
    int val;
    int num;
};
RES query(int u,int v,int l,int r,int x){
    if (l==r){
        return (RES){sum[v]-sum[u],l};
    }
    int mid=(l+r)>>1;
    RES Lres={0,0},Rres={0,0};
    if (2*(sum[lson[v]]-sum[lson[u]])>x) Lres=query(lson[u],lson[v],l,mid,x);
    if (2*(sum[rson[v]]-sum[rson[u]])>x) Rres=query(rson[u],rson[v],mid+1,r,x);
    if (Lres.val>Rres.val) return Lres;
    else                   return Rres;
}
int main(){
    // freopen("B.in","r",stdin);
    // freopen("B.ans","w",stdout);
    // ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    n=read(); m=read();
    root[0]=build(1,n);
    for (int i=1;i<=n;i++) a[i]=read();
    for (int i=1;i<=n;i++){
        root[i]=update(root[i-1],1,n,a[i]);
    }
    for (int i=1;i<=m;i++){
        int l,r;
        l=read(); r=read();
        RES res=query(root[l-1],root[r],1,n,r-l+1);
        write(res.num);
        // if (res.num) write(max(res.num-1,1)); //强行减1
        // else write(0);
        putchar('\n');
    }
    return 0;
}
2024/8/20 14:33
加载中...