fix(P6278.cpp): 修正二进制索引树实现中的错误

修复lb函数中错误的变量使用,将'n'改为'val'
修正upd函数中错误的加法操作,将'n'改为'add'
优化逆序对计算逻辑,调整索引计算方式
This commit is contained in:
Zengtudor 2025-09-01 20:28:21 +08:00
parent 9db115d255
commit e018452176

View File

@ -9,12 +9,12 @@ ll n,ans=0;
std::vector<ll> a,t,s; std::vector<ll> a,t,s;
static inline ll lb(ll val){ static inline ll lb(ll val){
return n&-n; return val&(-val);
} }
static inline void upd(ll idx,ll add){ static inline void upd(ll idx,ll add){
while (idx<=n) { while (idx<=n) {
t[idx]+=n; t[idx]+=add;
idx+=lb(idx); idx+=lb(idx);
} }
} }
@ -29,7 +29,7 @@ static inline ll get(ll idx){
} }
int main(){ int main(){
std::iostream::sync_with_stdio(false); std::ios::sync_with_stdio(false);
std::cin.tie(nullptr); std::cin.tie(nullptr);
std::cin>>n; std::cin>>n;
@ -40,13 +40,16 @@ int main(){
std::cin>>a[i]; std::cin>>a[i];
++a[i]; ++a[i];
} }
for(ll i=1;i<=n;++i){ for(ll i=1;i<=n;++i){
s[i]=get(a[i]); ll x = n - a[i] + 2;
upd(a[i],1); s[a[i]] += get(x-1);
upd(x, 1);
} }
std::cout<<"0\n"; std::cout<<"0\n";
for(ll i=1;i<=n;i++){ for(ll i=2;i<=n;i++){
ans+=s[i]; ans += s[i-1];
std::cout<<ans<<"\n"; std::cout<<ans<<"\n";
} }
} }