【數(shù)字_ID】HDU-1556-Color the ball(樹(shù)狀數(shù)組/區(qū)間修改單點(diǎn)查詢(xún))

  • 編輯:數(shù)字_ID
  • 2018年5月21日

1. 寫(xiě)在題前

  • 樹(shù)狀數(shù)組很優(yōu)雅,所以就找了一道水題來(lái)找信心
  • 盡量日更或者隔日更吧,之前比賽沒(méi)更,所以今天補(bǔ)上

2. 題意

  • 有n個(gè)數(shù),,k次操作,每次操作對(duì)某個(gè)區(qū)間的所有數(shù)都+1,問(wèn)第i個(gè)數(shù)最后變成了多少

3. 關(guān)于樹(shù)狀數(shù)組

  • 非常優(yōu)雅
  • 數(shù)組里每個(gè)位置存的數(shù),是這個(gè)位置坐標(biāo)所管理的范圍的數(shù)的和,每個(gè)坐標(biāo)所管理的范圍,是從這個(gè)數(shù)開(kāi)始往前數(shù)2^k個(gè),其中k是這個(gè)坐標(biāo)二進(jìn)制末尾0的個(gè)數(shù)
  • 網(wǎng)上有很多教程,大家可以學(xué)習(xí)學(xué)習(xí),在這里放出炒雞經(jīng)典的一個(gè)圖
    樹(shù)狀數(shù)組.png

4. 關(guān)于這道題

  • 這道題有一個(gè)很有意思的地方,一般樹(shù)狀數(shù)組是求前綴和的,但通過(guò)某種操作,可以用來(lái)求單個(gè)點(diǎn)的值,這種操作使得區(qū)間修改的復(fù)雜度大大降低
  • 首先來(lái)看題目,是要對(duì)某個(gè)區(qū)間進(jìn)行加固定值的操作,對(duì)于樹(shù)狀數(shù)組,每改變一個(gè)值,就要進(jìn)行O(logn)的復(fù)雜度來(lái)修改某些前綴和,對(duì)于n個(gè)點(diǎn),復(fù)雜度就變成了O(nlogn)。然而這道題有這么一種更簡(jiǎn)單的做法,對(duì)(i,j)區(qū)間進(jìn)行每個(gè)數(shù)加一個(gè)v,只需要對(duì)第i個(gè)位置加v,對(duì)第j+1個(gè)數(shù)-v,這樣每個(gè)位置的前綴和就是該位置最終的數(shù),非常的巧妙,大家可以自己思索一些,很優(yōu)雅

5. 代碼

#include<string.h>
#include<stdio.h>
#include<iostream>

using namespace std;


#define lowbit(x) (x&(-x))
const int maxn = 100020;

int n;
int a,b;
int sum[maxn];
void add(int pos,int val)
{
    while(pos<=n)
    {
        sum[pos] += val;
        pos += lowbit(pos);
    }
}

int query(int pos)
{
    int res = 0;
    while(pos>0)
    {
        res += sum[pos];
        pos -= lowbit(pos);
    }
    return res;
}
int main()
{
    while(cin>>n&&n!=0)
    {
        memset(sum,0,sizeof(sum));
        for(int i = 0;i<n;i++)
        {
            cin>>a>>b;
            add(a,1);
            add(b+1,-1);
        }
        for(int i = 1;i<=n;i++)
        {
            if(i == 1)cout<<query(i);
            else cout<<" "<<query(i);
        }
        cout<<endl;
    } 
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 樹(shù)狀數(shù)組用來(lái)求區(qū)間元素和,求一次區(qū)間元素和的時(shí)間效率為O(logn)。特別用于在數(shù)組內(nèi)的參數(shù)變換后,再次求和所使用...
    碧影江白閱讀 850評(píng)論 1 1
  • 《程序員代碼面試指南-左程云》筆記 第一章 棧和隊(duì)列 設(shè)計(jì)一個(gè)有g(shù)etMin功能的棧 實(shí)現(xiàn)一個(gè)特殊的棧,在實(shí)現(xiàn)棧的...
    xiaogmail閱讀 18,732評(píng)論 2 19
  • 3-20。118Days。 太久沒(méi)有寫(xiě)日記了。 和能寶在被窩里玩到中午。梁先生今天又去醫(yī)院替婆婆照顧外婆了,忘帶充...
    林培閱讀 410評(píng)論 0 0
  • NPM是隨同Node.js一起安裝的包管理工具,能解決Node.js代碼部署上的很多問(wèn)題。 所以先確保你正確安裝了...
    Llane00閱讀 1,812評(píng)論 0 1
  • 在朋友那兒聽(tīng)說(shuō) 知心的你曾回來(lái)過(guò) 想請(qǐng)他替我向你問(wèn)候 只為了怕見(jiàn)了說(shuō)不出口 你對(duì)以往的感觸還多不多 曾讓我心碎的你...
    曾小瑩閱讀 948評(píng)論 0 1

友情鏈接更多精彩內(nèi)容