第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

2023年GESP六級(jí)小楊握手問題(洛谷B3874):Fenwick樹求解逆序?qū)Φ拇a解析

https://img1.sycdn.imooc.com/be2c9268084d095709440757.jpg

一、题目解读

    “小杨的握手问题”源自2023年GESP六级考试(对应洛谷题目B3874)。题目描述为:给定一个长度为N的排列,每次将当前数与之前未访问过的数握手,求总共握手次数。本质上是求排列中逆序对的个数,即统计每个数右侧比它小的元素数量。需设计高效算法在O(NlogN)时间内解决。

二、解题思路

    核心思想是将握手次数转化为逆序对计数问题,利用Fenwick树(二叉索引树)实现动态区间查询与更新。通过维护数组元素的顺序统计信息,每次查询当前数之前已出现数的个数,即为该数的握手次数。关键在于将离散的握手操作转化为可差分维护的区间操作,避免暴力枚举

三、解题步骤

1. 数据预处理:将输入数据转换为1-based索引(原代码中通过order[i]++实现),便于Fenwick树操作。

2. 构建Fenwick树:初始化大小为N的树,初始值全为0。

3. 逆序对统计:

    1.遍历排列顺序,对于每个数current:

    2.查询ft.query(current-1):获取当前位置前比current小的元素个数(即左侧逆序对)。

    3.更新ft.update(current,1):将current加入树中,标记已访问。

4. 累计握手次数:将每次查询结果累加至handshakes变量。

5. 输出结果:最终handshakes即为总握手次数。

四、代码与注释

#include <iostream>#include <vector>using namespace std;class FenwickTree {private:
   vector<int> tree;
   int size;public:
   FenwickTree(int n) : size(n), tree(n + 1, 0) {} // 构造函数初始化树大小及全0数组
   
   void update(int index, int delta) {
       for(; index <= size; index += index & -index) // 从index到末尾更新,利用二进制位操作
           tree[index] += delta;
   }
   
   int query(int index) {
       int res = 0;
       for(; index > 0; index -= index & -index) // 从index到1查询,逐步累加
           res += tree[index];
       return res;
   }};int main() {
   ios::sync_with_stdio(false);
   cin.tie(nullptr); // 加快输入输出速度
   
   int N;
   cin >> N;
   vector<int> order(N);
   for(int i = 0; i < N; i++) {
       cin >> order[i];
       order[i]++; // 转换为1-based索引,适配Fenwick树操作
   }
   
   FenwickTree ft(N);
   long long handshakes = 0;
   
   for(int i = 0; i < N; i++) {
       int current = order[i];
       handshakes += ft.query(current - 1); // 查询比current小的已存在数个数
       ft.update(current, 1); // 标记当前数已出现
   }
   
   cout << handshakes << endl;
   return 0;}

五、总结

    本解法通过将握手问题转化为逆序对计数,利用Fenwick树的O(logN)区间查询与更新,实现高效求解。相较于暴力或归并排序等算法,Fenwick树具有代码简洁、常数优化的优势,尤其在处理动态统计问题时表现优异。掌握此类数据结构的应用,对算法竞赛与实际问题求解具有重要意义。

原文:2023年GESP六级小杨握手问题(洛谷B3874):Fenwick树求解逆序对的代码解析


點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消