GDOI2017模擬11 3 永恆的契約

2021-07-24 10:38:37 字數 3188 閱讀 5241

description

宅邸迅速的燃燒著,必須帶貝蒂走出**庫!憑著感覺,又一次直接找到**庫的門。

「你,是那個人嘛?」400年了,當初聖域建立結界時沒有進入聖域,被傷了心的人工精靈貝蒂,與強欲魔女簽訂契約,守護宅邸的**庫,直至「那個人」的到來,那個人會解開貝蒂的心結。

「我不是那個什麼人,但我會成為你唯一的人。我會給你幸福!」

精靈與人簽訂契約,從此相依為命。這便是,永恆的契約。

宅邸裡,羅茲瓦爾的房間圖書櫃後,有一條鏈結宅邸和聖域的秘密通道,其中有乙個神奇的大回環,由n塊石頭組成。

第i塊石頭有乙個高度ai,兩塊不同的石頭i,j能夠互相看到,則它們在環上的兩條路徑中有至少一條路徑上除了兩個端點(即i,j)路徑上石頭高度都不大於min(ai,aj)。

被羅茲瓦爾僱傭的獵腸者躲在這秘密的通道中,為了能夠更好的觀察通道中的情況,她想知道有多少對石頭能夠互相看到。

input

第一行乙個正整數t,表示資料組數。

接下來t組資料,每組資料第一行讀入正整數n,接下來一行按順時針順序讀入序列a表示石塊的高度。

output

t行表示每組資料的答案。

sample input

1 5

1 2 4 5 3

sample output

data constraint

40%,n<=200

60%,n<=2000

70%,n<=100000

80%,n<=1000000,1<=ai<=1000000

100%,n<=1000000,t<=5,1<=ai<=1000000000

我們可以先找到序列中最大的乙個值(如果有多個則取其中乙個),那麼兩個小於最大值的值是不可以穿過最大值的,而兩個等於最大值的值也可以通過另外乙個方向完成結合。所以我們可以破環為鏈

然後就可以用單調棧來解決這道問題

注意對a[i]=a[j]的統計的解決方法:統計棧中每乙個元素的出現次數,新加入乙個數之後就可以直接把ans加這個數

注意很多加一減一的細節

注意常數的優化

var

a,f,s,c:array[0..1500005]of longint;

bz:array[0..1000005]of boolean;

i,j,k,l,m,n,max,o,x:longint;

ans:int64;

begin

assign(input,'forever.in'); reset(input);

assign(output,'forever.out'); rewrite(output);

readln(o);

for o:=1

to o do

begin

readln(n);

max:=0;

for i:=1

to n do

begin

read(a[i]);

if a[i]>max then

begin

max:=a[i];

l:=i;

end;

end;

readln;

i:=l+1;

k:=1;

ans:=0;

while i<=n do

begin

c[k]:=a[i];

inc(k);

inc(i);

end;

i:=1;

while ido

begin

c[k]:=a[i];

inc(k);

inc(i);

end;

j:=1;

f[1]:=c[1];

s[1]:=1;

for i:=2

to n-1

doif c[i]then

begin

inc(j);

f[j]:=c[i];

s[j]:=1;

inc(ans,s[j]);

if c[i]=max then dec(ans);

endelse

if c[i]=f[j] then

begin

inc(s[j]);

if (j=1) or (c[i]=max) then dec(ans);

inc(ans,s[j]);

endelse

begin

while (j>0) and (c[i]>f[j]) do

begin

inc(ans,s[j]);

dec(j);

end;

if j>0

then inc(ans);

if f[j]=c[i] then

begin

inc(s[j]);

inc(ans,s[j]-1);

if (c[i]=max) or (j=1) then dec(ans);

endelse

begin

inc(j);

f[j]:=c[i];

s[j]:=1;

end;

end;

max:=0;

i:=l-1;

while i<>l do

begin

if i=0

then i:=n;

bz[i]:=false;

if a[i]>=max then

begin

inc(ans);

max:=a[i];

bz[i]:=true;

end;

dec(i);

if i=0

then i:=n;

end;

max:=0;

i:=l+1;

while i<>l do

begin

if a[i]>=max then

begin

if bz[i]=false

then inc(ans);

max:=a[i];

bz[i]:=true;

end;

inc(i);

if i>n then i:=1;

end;

writeln(ans);

end;

close(input); close(output);

end.

GDOI2017模擬8 12 躲藏

給出乙個n m的網格圖,圖中有一些障礙節點。現在有a個男生和b個女生,還有乙個小標。男生要和女生配對,小標可以和任何乙個人配對。每一對cp 霧 只能待在乙個點。乙個點只能有一對cp。現在給出a b 1個人的初始座標,和他們的移動速度 即移動到4相鄰格仔所需的時間 所有人同時移動,求完成配對的最小時間...

GDOI2017模擬8 12 新車

平面上有乙個數軸,e點為目標點。你現在要開 車從w前往e,每移動1格需要1l油。你的油箱容量為s,初始時裝滿了98 汽油。數軸上有n個加油站,每個加油站提供98 95 92 中的一種。到了加油站你可以選擇加任意數量的油,你的油箱是茲瓷所有油甚至混合油的。你認為98 最吼,95 其次,92 跑的最慢。...

GDOI2017模擬11 5 總結

看到第一題,哇,數論題,不會啊,感覺要跪 正當我迷茫的時候,突然機房斷電了。啪的一聲大家的電腦都黑了!不知所措!沒辦法,只好等等。過了10分鐘左右,來電了,重新看了看第一題,也許是冷靜下來了,發現直接暴力分解質因數就能過!繼續看第二題,在草稿紙上推了一下,要用揹包,一開始以為會超時,但仔細想了想發現...