免費送氣球

2021-09-12 17:41:45 字數 1517 閱讀 9358

c++版本一

題解:每次1操作會往序列底加first個second,first 和 second 都是最大1e9的資料,每次2操作詢問序列中第first到第second個數的和

一開始就感覺有點像線段樹,輸入資料太大我們可以離線處理把資料離散化下,然後扔到線段樹上,維護兩個陣列:

sum: 區間數的值的和  num: 區間數的數量和  ,對於每次詢問的first和second,我們找到第first個和第second個分別是哪兩個數字,

如果兩個數字不相同,那麼就先算出分別取了多少個這兩個數字,對於兩個數字中間的數字和我們可以直接用線段樹區間求和得到

感覺應該有更簡單的寫法,不過一開始思路就往線段樹上偏了,乾脆直接用線段樹寫了。。。。。。

#includeusing namespace std;

#define ll long long

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define mid ll m = (l + r) >> 1

const ll mod = 1000000007;

const ll m = 2e5+10;

ll sum[m<<2],num[m<<2],b[m],op[m],vis[m ];

struct nodea[m];

void update(ll p,ll c,ll l,ll r,ll rt)

mid;

if(p <= m) update(p,c,lson);

else update(p,c,rson);

sum[rt] = (sum[rt<<1] + sum[rt<<1|1])%mod;

num[rt] = num[rt<<1] + num[rt<<1|1];

}ll ask(ll l,ll r,ll l,ll r,ll rt)

mid;

ll ret = 0;

if(l <= m) ret = (ret + ask(l,r,lson))%mod;

if(r > m) ret = (ret + ask(l,r,rson))%mod;

return ret;

}ll ask1(ll p,ll l,ll r,ll rt)

mid;

if(p <= num[rt<<1]) ask1(p,lson);

else ask1(p-num[rt<<1],rson);

}ll ask2(ll l,ll r,ll l,ll r,ll rt)

mid;

ll ret = 0;

if(l <= m) ret += ask2(l,r,lson);

if(r > m) ret += ask2(l,r,rson);

return ret;

}int main()

sort(b+1,b+1+cnt);

for(ll i = 1;i <= n;i ++)

else

else}}

}

HDU 6464 免費送氣球 (線段樹)

又到了gdut一年一度的程式設計競賽校賽的時間啦。同學們只要參加校賽,並且每解出一道題目就可以免費獲得由acm協會和集訓隊送出的氣球乙個。聽到這個訊息,jmc也想參加免費拿氣球。可是,由於jmc太菜了而被禁止參賽,於是他找到你想讓你幫忙參加比賽,可以通過執行下面的c 程式解決問題後獲得氣球並送給他。...

HDU 6464 免費送氣球(線段樹二分)

題意 又到了gdut一年一度的程式設計競賽校賽的時間啦。同學們只要參加校賽,並且每解出一道題目就可以免費獲得由acm協會和集訓隊送出的氣球乙個。聽到這個訊息,jmc也想參加免費拿氣球。可是,由於jmc太菜了而被禁止參賽,於是他找到你想讓你幫忙參加比賽,可以通過執行下面的c 程式解決問題後獲得氣球並送...

免費送大家 20 本書

感謝大家關注我,我要送書給你們,而且是一言不合就送書!本次送的書是 學習力 共20本。2019年來自職場的扎心三問 有很多要學的內容,但工作忙得根本沒有時間,怎麼辦?工作了很多年,但知識支離破碎得不成體系,怎麼辦?想轉行,但又缺少工作必需的知識和技能,怎麼辦?其實,這一切只是因為你用的方法不適合你,...