From 6acad9f13ba8f51c6563f274244c8b34c46eadfd Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Mon, 1 Sep 2025 12:16:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0P3608.cpp=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E9=80=86=E5=BA=8F=E5=AF=B9=E7=BB=9F=E8=AE=A1=E4=B8=8E?= =?UTF-8?q?=E4=B8=8D=E5=B9=B3=E8=A1=A1=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现基于树状数组的逆序对统计功能,用于检测序列中的不平衡元素。 通过排序和离散化处理输入数据,计算每个元素左右两侧的逆序对数量, 并判断是否满足不平衡条件(max(l,r) > min(l,r)*2)。 --- EOF | 0 src/9/P3608.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 EOF create mode 100644 src/9/P3608.cpp diff --git a/EOF b/EOF new file mode 100644 index 0000000..e69de29 diff --git a/src/9/P3608.cpp b/src/9/P3608.cpp new file mode 100644 index 0000000..76520b3 --- /dev/null +++ b/src/9/P3608.cpp @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include +#include +#include +using ll = int64_t; + +ll n,ans=0; +std::vector a,raw; +std::map m; +std::vector t; + +static inline constexpr ll lb(ll n){ + return n&(-n); +} + +static inline void upd(ll idx, ll add){ + while(idx<=n){ + 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; + raw.resize(n+1); + t.resize(n+1); + for(ll i=1;i<=n;++i){ + std::cin>>raw[i]; + } + a=raw; + std::sort(a.begin()+1,a.end()); + for(ll i=1;i<=n;i++){ + m[a[i]]=i; + } + for(ll i=1;i<=n;i++){ + raw[i]=m[raw[i]]; + // printf("raw[%lld]=%lld\n",i,raw[i]); + } + for(ll i=1;i<=n;i++){ + ll g=n-raw[i]; + ll l=i-1-get(raw[i]); + ll r = g-l; + // printf("i=%lld, l=%lld, r=%lld\n",i,l,r); + if(std::max(l,r)>std::min(l,r)*2){ + ans++; + } + upd(raw[i],1); + } + std::cout<