洛谷P2827,NOIP2016 蚯蚓

2021-10-10 07:04:11 字數 3529 閱讀 3528

**傳送門

考慮優先佇列:

但是蚯蚓的長度是變化的,如果每一次操作都修改所有蚯蚓的長度,必然超時.但是每一次所有蚯蚓中,只有被斬斷生成的兩個沒有+q,其它所有蚯蚓長度均+q.不難想到,用優先佇列**兩個值:len表示被壓入優先佇列時的長度,t表示被壓入優先佇列的時間,如果當前時間為i,那麼當前蚯蚓的實際長度(考慮當前秒蚯蚓的長度已經加上q)就是len + (i - t) * q.

關於過載運算子:把len和t**在node型別中,對於node型別的變數a和b,當前時間為i

則a當前的長度為

a .l

en+(

i−a.

t)⋅q

=a.l

en+i

⋅q+a

.t⋅q

a.len+(i-a.t)\cdot q=a.len+i\cdot q +a.t\cdot q

a.len+

(i−a

.t)⋅

q=a.

len+

i⋅q+

a.t⋅

qb當前的長度為

b .l

en+(

i−a.

t)⋅q

=b.l

en+i

⋅q+b

.t⋅q

b.len+(i-a.t)\cdot q=b.len+i\cdot q +b.t\cdot q

b.len+

(i−a

.t)⋅

q=b.

len+

i⋅q+

b.t⋅

q若a當前長度小於b當前長度

a .l

en+i

⋅q+a

.t⋅q

len+

i⋅q+

b.t⋅

qa.len+i\cdot q +a.t\cdot q < b.len+i\cdot q +b.t\cdot q

a.len+

i⋅q+

a.t⋅

qlen+

i⋅q+

b.t⋅

q化簡:

a .l

en+a

.t⋅q

len+

b.t⋅

qa.len +a.t\cdot q < b.len +b.t\cdot q

a.len+

a.t⋅

qlen+

b.t⋅

q所以,比較當前長度與當前時間無關,寫成**:

struct node

};

剩下的不再贅述,直接模擬即可

根據題目的性質,若一條蚯蚓a的長度大於等於另一條蚯蚓b的長度,那麼**後必有

max ⁡(

a1,a

2)

>

=max⁡(

b1,b

2)

,min⁡(

a1,a

2)

>

=min⁡(

b1,b

2)

\max(a1,a2)>=\max(b1,b2),\min(a1,a2)>=\min(b1,b2)

max(a1

,a2)

>

=max(b

1,b2

),min(a1

,a2)

>

=min(b

1,b2

)a1,a2表示a蚯蚓**後的兩條蚯蚓

我們定義兩個node型別的佇列q1,q2.條蚯蚓**後較長的一條和較短的一條分別存入q1,q2(具體哪個放長的哪個放短的都一樣,我的程式裡也沒有仔細考慮這個).根據上述性質,經過一點處理,不用大根堆也能維護q1,q2有序

剩下的就是一堆細節問題了,請自行體會,研究.

#include

#include

#include

using

namespace std;

intread()

while

(c >=

'0'&& c <=

'9')

return re * sig;

}int n , m , q , u , v , t;

struct node};

inline node pus

(int len ,

int t)

priority_queue que;

intmain()

for(

int i =

1; i <= m ; i++

)putchar

('\n');

for(

int i =

1; i <= m + n ; i++

) que.

pop();

}return0;

}

#include

#include

#include

#include

using

namespace std;

intread()

while

(c >=

'0'&& c <=

'9')

return re * sig;

}int n , m , q , u , v , t;

struct node};

inline node pus

(int len ,

int t)

struct queue

inline node front()

inline

void

push

(int len ,

int t_)

inline

void

pop(

)inline

bool

empty()

inline

void

sort_()

inline

void

print()

bool

check()

};queue q1 , q2 , q0;

node maxx()

else

}else

else

}return tmp;

}int

main()

q0.sort_()

;//保證有序

for(

int i =

1; i <= m ; i++

) q1.

push

(tmp2 , i)

;//分別存放長/短蚯蚓

q2.push

(tmp1 , i);}

putchar

('\n');

node k;

for(

int i =

1; i <= m + n ; i++)}

return0;

}

洛谷P2827 NOIP2016 蚯蚓

題目描述 輸入 輸出 思路分析 70分寫法 看到每次取出最大值,第一眼想到的就是優先佇列,我們可以每一次取完隊首元素後將其分開後兩段的長度進行計算,再放入佇列之中即可 但題目中要求,除被切開的蚯蚓外,其餘蚯蚓長度要變長,每次把隊中元素取出並加上q再放入隊中?不用說我們也知道這是不行的,那我們可以 考...

洛谷P2827 NOIP2016 提高組 蚯蚓

題鏈 最長的蚯蚓被砍兩截之後,其餘的蚯蚓長度會增加,與其加其餘蚯蚓不如對這兩隻蚯蚓操作,可定義乙個buff表示其餘蚯蚓需要增加多少長度,當拿出最長的那只蚯蚓時,就需要加上buff,當然被剪斷的變成兩條就需要減去當前buff再壓入佇列,保證下次拿出來時加上buff是應有的長度 乙個佇列存原陣列,另外兩...

P2827 NOIP2016 提高組 佇列

題意 傳送門 p2827 noip2016 提高組 蚯蚓 題解容易想到使用二叉堆維護長度的最大值,由於每次新產生之外的蚯蚓長度都增加 q qq,而難以修改已經在堆中的元素,那麼對新產生的蚯蚓長度減 q qq,可以使長度的相互關係保持不變。時間複雜度 o m log n o m log n o mlo...