線段樹 烏鴉喝水

2022-03-27 07:14:11 字數 2298 閱讀 3208

問題 b: 烏鴉喝水

時間限制: 2 sec 記憶體限制: 128 mb

題目描述

【題目背景】

乙隻烏鴉在自娛自樂,它在面前放了n個有魔力的水缸,水缸裡裝有無限的水。

【題目描述】

他準備從第1個水缸飛到第n個水缸,共m次。在飛過乙個水缸的過程中,如果他能夠得著水缸裡的水,即水缸口到水面距離小於等於烏鴉能夠得著的深度,那它就會喝水缸裡的水。每喝一次水,所有水缸裡的水位都會下降,第i個水缸裡的水位會下降ai,注意喝水是瞬間的,如果烏鴉剛好夠得著,但喝完之後夠不著,也視為喝到一次,水位也會相應的下降。

input

共有3行。第一行有三個正整數n、m和x,用空格隔開。n表示水缸的數量,m表示烏鴉飛的次數,x表示烏鴉能夠得著的深度。第二行,有n個用空格隔開的正整數,第i個數為第i個水缸中水缸口到水面的距離wi。第三行,有n個用空格隔開的正整數,第i個為ai。

output

只有一行,這一行只有乙個正整數,為這只烏鴉能喝到水的次數。

sample input

5 2 20

15 14 13 12 12

1 1 1 1 1

sample output

9 【資料範圍】

100%的資料,0<n≤100000,0<m≤100000,0<x≤2000000000,0<wi≤2000000000,0<ai≤200。

設 num=(x-w[i])/a[i]這個就是當前的缸還能撐住水位下降幾次。

又因為雖然他能撐住這麼多次,但是烏鴉飛到他上面前還要過i-1個缸,又要喝水。

所以num[i]=(x-w[i])/a[i]-i+1;這樣就可以了。但是如果前面的乙個缸不會被喝水,那麼後面就被多減了,其實可以找到第乙個會被乾掉的點,刪掉,再給他後面的區間+1,就又解決了。耳罩第乙個不符合的點只要維護個區間最小,二分一下。

所以每一輪只要刪掉所有不滿足的,給後面加回來,讓ans+=根節點上符合的個數就好了。

跑得賊快。

#pragma gcc optimize("o3")

#include

#include

#include

#include

#include

#define n 100005

#define mod 10000000007ll

#define ll long long

using namespace std;

struct treet[n*4];

int n,m;ll ans,x,w[n],a[n],zz[n];

ll min(ll x,ll y)

void down(int

x)void build(int l,int r,int

x) int mid=l+r>>1;

build(l,mid,x

*2);build(mid+1,r,x

*2+1);

t[x].sum=t[x

*2].sum+t[x

*2+1].sum;

t[x].h=min(t[x

*2].h,t[x

*2+1].h);

}void c(int l,int r,int

x) if(t[x].lz)down(x);

int mid=t[x].l+t[x].r>>1;

if(l<=mid)c(l,r,x

*2);

if(r>mid)c(l,r,x

*2+1);

t[x].sum=t[x

*2].sum+t[x

*2+1].sum;

t[x].h=min(t[x

*2].h,t[x

*2+1].h);

}void del(int l,int

x) int mid=t[x].l+t[x].r>>1;

if(t[x].lz)down(x);

if(l<=mid)del(l,x

*2);

else del(l,x

*2+1);

t[x].sum=t[x

*2].sum+t[x

*2+1].sum;

t[x].h=min(t[x

*2].h,t[x

*2+1].h);

}int

q(ll k,int x)

int main()

ans+=t[1].sum;

if(!t[1].sum)break;

}printf("%lld\n",ans);

}

新編烏鴉喝水

一群烏鴉飛了一天,又渴又累。這時候它們看到地下有乙個長的玻璃瓶子,裡面有一點點水。它們趕緊圍過去搶水喝。第1個烏鴉把它的嘴塞到瓶口裡,可是瓶子太高,水太少,它夠不著。第2個烏鴉見了,忙說 這樣不行,看,那邊有好多小石頭,咱們把石頭仍進去,水就滿上來了.還沒等它說完,第3個烏鴉搶過瓶子說 那怎麼行,石...

Bzoj3441 烏鴉喝水

time limit 20 sec memory limit 128 mb submit 258 solved 97 題目背景 乙隻烏鴉在自娛自樂,它在面前放了n個有魔力的水缸,水缸裡裝有無限的水。題目描述 他準備從第1個水缸飛到第n個水缸,共m次。在飛過乙個水缸的過程中,如果他能夠得著水缸裡的水,...

線段樹 02 構建線段樹

public inte ce merger 不能再縮小的基本問題是 對treeindex指向的節點的情況進行討論 public class segmenttree 在treeindex的位置建立表示區間 l.r 的線段樹 private void buildsegmenttree int treei...