Bzoj3441 烏鴉喝水

2022-05-13 12:57:18 字數 2492 閱讀 9993

time limit: 20 sec  memory limit: 128 mb

submit: 258  solved: 97

【題目背景】

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

【題目描述】

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

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

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

5 2 20

15 14 13 12 12

1 1 1 1 1

9【資料範圍】

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

2016.7.8重設時限,未重測!

by lll6924 at 「醬油杯noi考後歡樂賽」

腦洞題應該算貪心+二分吧,思路挺神奇的

烏鴉喝水是「能喝的時候一定喝」的,所以和dp決策沒關係。

直接模擬的複雜度為$o(nm)$

把每個水缸按照可以喝水的次數(即喝多少次水,水位下降到喝不到)由小到大排序,依次處理。

顯然如果前面的水缸能喝n次,後面的水缸至少也能喝n次,這個性質十分有用。

由上面這句話可以推出:如果烏鴉從當前位置飛到隊伍末會經過k個能喝的水缸,而當前水缸還能喝的次數x>=k,那麼之後的水缸也不會在這一輪被喝空。

1、列舉每乙個水缸開始(在列舉到該水缸的時候,前面剩餘次數更小的水缸已經被喝完。或者可以理解為,捨棄前面的缸,貪心喝這個。)

2、用樹狀陣列維護水缸的id,查詢從當前水缸的id到(原先的)第n個水缸還有多少個能喝的水缸,如果當前缸的剩餘次數》=剩餘缸數,直接更新次數並跳到下一輪。

3、在數次2操作後,當前缸的剩餘次數<=剩餘缸數,此時在樹狀陣列上二分「餘數」,即喝到又一輪的某位置時,當前缸沒水了。

4、將當前缸標為空,列舉下乙個水缸。

表面看著複雜度高,實際上喝水的次數不會超過最多的那個缸能喝的次數(因為每次喝水都是所有缸水位一起下降的),同時,模擬操作的次數不會超過m(最多喝m輪),複雜度可以接受。

1

/*by silvern

*/2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9const

int mxn=100010;10

intread()

13while(ch>='

0' && ch<='9')

14return x*f;15}

16int

n,m,x,n;

17int

t[mxn];

18void add(int x,int

v)return;20

}21int que(int

x)24

return

res;25}

26struct

node

29}a[mxn];

30int cir,last=0;31

int tot=0;32

int find(int

x)40

else r=mid-1;41

}42return

res;43}

44void

solve()

50while(cira[i].cnt)

56if(cir>=m)break;57

int ed=find(a[i].cnt-tot);

58//

tot+=ed-last;

//wrong

59 tot=a[i].cnt;

60 last=ed;

61 add(a[i].id,-1

);62}63

return;64

}65intmain()

74 w=0;75

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

76if

(a[i].cnt)

80 n=w;

81 sort(a+1,a+n+1

);82

solve();

83 printf("

%d\n

",tot);

84return0;

85 }

BZOJ 2301 莫比烏斯

比較裸的一道莫比烏斯入門題 具體題解網上多的是 比較簡單 不知道為什麼別人 都那麼長 沒有我的優雅哈哈哈 這題不要列舉 要分塊處理 ac includeusing namespace std typedef long long ll const ll n 1e6 ll miu n 10 v n 10...

bzoj 2440 (莫比烏斯函式)

bzoj 2440 完全平方數 題意 找出第k個不是完全平方數的正整數倍的數。例如 4 9 16 25 36什麼的 通過容斥原理,我們減去所有完全數 4有n 4個,但是先36這種會被重複減去,所有我們還需要加上類似36的數,然後你會發現這些數前面的符號和他們開根號的 莫比烏斯函式一樣 資料很大有1e...

BZOJ 2440 莫比烏斯函式

題目鏈結 description 小 x 自幼就很喜歡數。但奇怪的是,他十分討厭完全平方數。他覺得這些 數看起來很令人難受。由此,他也討厭所有是完全平方數的正整數倍的數。然而 這絲毫不影響他對其他數的熱愛。這天是小x的生日,小 w 想送乙個數給他作為生日禮物。當然他不能送一 個小x討厭的數。他列出了...