NOIP2016提高A組五校聯考1 道路規劃

2021-07-23 09:46:49 字數 1953 閱讀 3702

一開始想到了70分的,然後很快發現線段樹的優化,結果乙個細節掛掉qaq

首先70分的話就是乙個f[i]表示上面的位置最後乙個為i的時候可以選的最大的集合,顯然在下面的值相同的那個點一定是在最右邊的,那麼直接n2

即可 然後100分的話就是拿線段樹,那麼就可以用log的時間來求出每乙個f[i]的值

var

tree:array[0..500005]of longint;

a,b:array[0..100005]of longint;

i,j,k,l,n,x,y,ans,xx,***:longint;

function

max(x,y:longint):longint;

begin

if x>y then

exit(x) else

exit(y);

end;

procedure

change

(v,l,r,x:longint);

var mid:longint;

begin

if l=r then tree[v]:=y else

begin

mid:=(l+r) div

2; if x<=mid then change(v*2,l,mid,x) else change(v*2+1,mid+1,r,x);

tree[v]:=max(tree[v*2],tree[v*2+1]);

end;

end;

procedure

find

(v,l,r,x,y:longint);

var mid:longint;

begin

if (l=x) and (r=y) then xx:=max(xx,tree[v]) else

begin

mid:=(l+r) div

2; if x>mid then find(v*2+1,mid+1,r,x,y) else

if y<=mid then find(v*2,l,mid,x,y) else

begin

find(v*2,l,mid,x,mid);

find(v*2+1,mid+1,r,mid+1,y);

end;

end;

end;

begin

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

readln(n);

for i:=1

to n do

read(a[i]);

readln;

for i:=1

to n do

begin

read(x);

b[x]:=i;

end;

for i:=1

to n do

begin

xx:=0;

find(1,1,n,b[a[i]],n);

y:=xx+1;

if y>ans then ans:=y;

change(1,1,n,b[a[i]]);

end;

writeln(ans);

close(input);

end.

NOIP2016提高A組五校聯考1 道路規劃

我們考慮,當現在有乙個合法的集合時,如何往裡面增加乙個點,使這個集合仍然合法。假設現在有乙個合法的集合,那麼當我們加入乙個點,它的道路穿過來整個集合,那麼 然後搞一遍最長下降子串行就可以了。include include include include include const int maxlo...

NOIP2016提高A組五校聯考1 挖金礦

剛看到這題時,還在想怎麼貪心,然後很快的打完之後發現貪心是錯的。然後仔細的看了看範圍,哈哈,這不是二分嗎。二分出乙個mid,然後在所有行裡面用mid j 字首和然後找乙個最大值。最後把這些最大值加起來,判斷一下就好了。include include include include include i...

NOIP2016提高A組五校聯考1 挖金礦

答案,保留4位小數 4 3 4 3 3 5 1 6 2 6 1 3 2 9 4.4286 n m 100000 很簡單的一道題 設sum i j 表示第i列向下挖j行的字首和 假設第i列挖h i 行 設二分的答案是m,答案如果合法,那麼 n i 1s um i h i ni 1 h i m 移項 i...