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年來自職場的扎心三問 有很多要學的內容,但工作忙得根本沒有時間,怎麼辦?工作了很多年,但知識支離破碎得不成體系,怎麼辦?想轉行,但又缺少工作必需的知識和技能,怎麼辦?其實,這一切只是因為你用的方法不適合你,...