Compare commits

..

2 Commits

Author SHA1 Message Date
9db115d255 refactor(9): 重构P3608.cpp并添加P6278.cpp
将P3608.cpp移动到9/1目录并扩展功能
新增P6278.cpp实现树状数组相关算法
修改test.cpp添加输入处理和异常检查
2025-09-01 15:26:27 +08:00
6acad9f13b feat: 添加P3608.cpp实现逆序对统计与不平衡检测
实现基于树状数组的逆序对统计功能,用于检测序列中的不平衡元素。
通过排序和离散化处理输入数据,计算每个元素左右两侧的逆序对数量,
并判断是否满足不平衡条件(max(l,r) > min(l,r)*2)。
2025-09-01 12:16:57 +08:00
4 changed files with 135 additions and 5 deletions

0
EOF Normal file
View File

67
src/9/1/P3608.cpp Normal file
View File

@ -0,0 +1,67 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <map>
#include <vector>
using ll = int64_t;
ll n,ans=0;
std::vector<ll> a,raw;
std::map<ll, ll> m;
std::vector<ll> 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<<ans<<"\n";
}

52
src/9/1/P6278.cpp Normal file
View File

@ -0,0 +1,52 @@
#include <cstdint>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
ll n,ans=0;
std::vector<ll> a,t,s;
static inline ll lb(ll val){
return n&-n;
}
static inline void upd(ll idx,ll add){
while (idx<=n) {
t[idx]+=n;
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);
s.resize(n+2);
t.resize(n+2);
for(ll i=1;i<=n;++i){
std::cin>>a[i];
++a[i];
}
for(ll i=1;i<=n;++i){
s[i]=get(a[i]);
upd(a[i],1);
}
std::cout<<"0\n";
for(ll i=1;i<=n;i++){
ans+=s[i];
std::cout<<ans<<"\n";
}
}

View File

@ -1,8 +1,19 @@
#include <cmath>
#include <iostream>
using namespace std;
#include <set>
#include <stdexcept>
#include <string>
int main(){
int a = 1;
a<<=32;
cout<<a<<"\n";
int n;
std::cin>>n;
std::set<int> s;
std::cout<<n<<"\n";
for(int i=1;i<=n;i++){
int tmp;
std::cin>>tmp;
if(s.find(tmp)==s.end()){
throw std::runtime_error(std::to_string(tmp));
}
s.insert(tmp);
}
}