From cc3380434cd14727d4392e41c99b52db1b5de05e Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Wed, 3 Sep 2025 17:27:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0P3660=E9=A2=98?= =?UTF-8?q?=E8=A7=A3=E5=AE=9E=E7=8E=B0=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=A0=91?= =?UTF-8?q?=E7=8A=B6=E6=95=B0=E7=BB=84=E8=AE=A1=E7=AE=97=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E5=AF=B9=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现了一个使用树状数组的解法来计算数组中成对元素的交叉对数。通过维护一个访问标记数组和树状数组来高效统计区间和,优化了计算过程。 --- src/9/3/P3660.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/9/3/P3660.cpp diff --git a/src/9/3/P3660.cpp b/src/9/3/P3660.cpp new file mode 100644 index 0000000..e752dd5 --- /dev/null +++ b/src/9/3/P3660.cpp @@ -0,0 +1,55 @@ +#include +#include +#include +#include +using ll = int64_t; + +ll n,ans=0; +std::vector vis,t,a; + +static inline ll lb(const ll n){ + return n&(-n); +} + +static inline void upd(ll idx,ll add){ + while(idx<=2*n){ // 注意要*2 + t[idx]+=add; + idx+=lb(idx); + } +} + +static inline ll get(ll idx){ + ll res=0; + while(idx){ + res+=t[idx]; + idx-=lb(idx); + } + return res; +} + +int main(){ + std::iostream::sync_with_stdio(false); + std::cin.tie(nullptr); + + std::cin>>n; + a.resize(n*2+1); + vis.resize(n+1); + t.resize(n*2+1); + + for(ll i=1;i<=n*2;i++){ + std::cin>>a[i]; + } + + for(ll i=1;i<=n*2;i++){ + if(vis[a[i]]){ + ll nans=get(i)-get(vis[a[i]]); + ans+=nans; + // printf("%lld += %lld\n",i,nans); + upd(vis[a[i]], -1); + }else{ + upd(i, 1); + vis[a[i]]=i; + } + } + std::cout<