wa了好多好多次了,终于加了个mod就过了,尼玛。。。。。。
[code lang="cpp"]
i64 query(int pos)
{
i64 sum = 0 ;
while(pos > 0 )
{
sum += f[pos] %mod;
pos -= lowbit(pos);
}
return sum;
}
void update(int pos,i64 val)
{
while(pos <= nn)
{
f[pos] += val % mod;
pos += lowbit(pos);
}
}
int main()
{
while(scanf("%d%d",&n,&d)!=EOF)
{
nn1 = 0 ;
for(int i = 0 ; i < n ; i++)
{
RD(a[i]);
d1[nn1 ++ ] = a[i];
d1[nn1 ++ ] = a[i] - d - 1;
d1[nn1 ++ ] = a[i] + d;
}
sort(d1,d1+nn1);
nn = 0;
for(int i=1; i<nn1; i++)
if(d1[i] != d1[nn])
d1[++nn] = d1[i];
for(int i=0; i<n; i++)
{
pos[i] = lower_bound(d1,d1+nn,a[i]) - d1 + 1;
}
clr(f,0);
clr(dp,0);
for(int i=0; i<n; i++)
{
int pos1,pos2;
i64 tmp1,tmp2,tmp;
pos1 = lower_bound(d1,d1+nn,a[i] + d ) - d1 + 1;
pos2 = lower_bound(d1,d1+nn,a[i] - d - 1 ) - d1 + 1;
tmp = query(pos1) - query(pos2) + mod + mod ;
dp[pos[i]] += tmp % mod;
update(pos[i],(tmp + 1) % mod );
}
i64 ans ;
ans = 0;
for(int i=1 ; i<=nn; i++) ans += dp[i] % mod;
PR(ans%mod);
}
return 0;
}
[/code]