蒟蒻求助25分TLE

P1908 逆序对

Mine_King @ 2020-09-03 20:05:24

只有钱5个点AC,其他全都TLE/kk
求大佬帮忙debug

#include<cstdio>
using namespace std;
int n;
long long ans;
struct tree
{
    int tot;
    int ls[1000005],rs[1000005];
    int l[1000005],r[1000005];
    int w[1000005];
    int build(int ll,int rr)
    {
        tot++;
        w[tot]=0;
        ls[tot]=rs[tot]=0;
        l[tot]=ll,r[tot]=rr;
        return tot;
    }
    void change(int k,int x)
    {
        if(l[k]==r[k])
        {
            w[k]++;
            return ;
        }
        int mid=(l[k]+r[k])/2;
        if(x<=mid)
        {
            if(ls[k]==0) ls[k]=build(l[k],mid);
            change(ls[k],x);
        }
        else
        {
            if(rs[k]==0) rs[k]=build(mid+1,r[k]);
            change(rs[k],x);
        }
        w[k]=w[ls[k]]+w[rs[k]];
        return ;
    }
    int ask(int k,int x)
    {
        if(l[k]==r[k]) return w[k];
        int mid=(l[k]+r[k])/2,res=0;
        if(x<=mid)
            if(ls[k]!=0) res+=ask(ls[k],x);
        if(rs[k]!=0) res+=ask(rs[k],x);
        return res;
    }
}tr;
int main()
{
    scanf("%d",&n);
    tr.build(0,1000000000);
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        ans+=tr.ask(1,x+1);
        tr.change(1,x);
    }
    printf("%lld\n",ans);
    return 0;
}

by wurzang @ 2020-09-03 20:10:02

@Mine_King

tr.build(0,1000000000);

。?


by wurzang @ 2020-09-03 20:11:10

老哥你建树的时空复杂度均为 10^9


by Mine_King @ 2020-09-03 20:12:11

@exzαng 不啊,这不是只建了一个点吗/kel
忘记说了我写的是动态开点权值线段树/kk


by wurzang @ 2020-09-03 20:30:58

@Mine_King

看错了,小问题

找不出 tle 的错误,倒是找出了 wa 的,比如说下面一个数据:

3 
-1 -1 -1

毕竟题目里不保证数字均为正整数。。。


by Mine_King @ 2020-09-03 20:33:06

啊过了(((
刚刚人傻了查询可以区间查询的(((
不过好像确实都是自然数的说(((


by wurzang @ 2020-09-03 20:36:30

还有一件事就是你数组开小了

过了?那没事了


|