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
老哥你建树的时空复杂度均为
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
还有一件事就是你数组开小了
过了?那没事了