2163. 【2017.7.12普及】演算法學習 (file io): input:sfxx.in output:sfxx.out時間限制: 1000 ms 空間限制: 262144 kb 具體限制 題目描述 自從學習了動態規劃後,famer kxp對動態規劃的熱愛便一發不可收拾,每天都想找點題做,一天,他找到了一道題,但是不會做,於是,他找到了你。題目如下: 給出n個無序不重複的數,再有m個詢問,每次詢問乙個數是否在那n個數中,若在,則ans增加2^k,k為該數在原數列中的位置。由於ans過大,所以只要求你輸出ans mod 10^9+7。輸入第一行,兩個數n,m,第二行n個數,第三行m個數。輸出 輸出最終答案。樣例輸入5 51 3 4 6 51 8 1 3 6樣例輸出24 資料範圍限制30% 0《n,m《10050% 0,n,m《10000100% 0《n,m《100000輸入的數均在2^31 以內解: 這題快速冪加二分查詢。 也可以打表加二分,反正都是滿分。打表需要打完所有的可能;既2的100以內的次方。快速冪就是一種神奇的演算法。。。
var
l,r,n,i,j,m,mid,p,ans:longint; a:
array[1
..100000,1
..2] of
longint; s:
array[0
..100000
] of
longint;
procedure
qsort
(x,y:longint)
;var
i,j,mid: longint; t:
array[1
..2] of
longint;
begin
i:=x;
j:=y;
mid:=a[x,1];
repeat
while
mid1
] do
dec(j);
while
mid>a[i,1]
doinc(i); if
i<=j
then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
inc(i);
dec(j);
end;
until
i>j; if
ithen
qsort(i,y); if
xthen
qsort(x,j);
end;
procedureaa;
begin
fori:=1
tom do
begin
read
(p);
l:=1;
r:=n;
while
ldo
begin
mid:=(l+r)
div2;
ifa[mid,
1]>=p
then
r:=mid
else
l:=mid+1;
end;
ifa[l,
1]=p
then
ans:=(ans+s[a[l,
2]])
mod1000000007;
end;
end;
begin
assign(input,
'sfxx.in');
reset(input);
assign(output,
'sfxx.out');
rewrite(output);
readln(n,m); s[
0]:=1;
fori:=1
ton do
begin
read
(a[i,
1]);
a[i,
2]:=i;
s[i]:=(s[i-1]*
2) mod1000000007;
end;
qsort(
1,n);
aa;writeln(ans);
end.
本題不提供打表程式(不解釋/滑稽)。今天又只寫了一題,不過我分享一種演算法。並查集: 我應該學過,but啦啦啦。我忘了。。
並查集是一種樹型的資料結構,用於處理一些不相交集合的合併問題。
(這句話,我承認不是我想的,是複製來的,不過說的很有道理。en); 並查集的主要操作有:
1-合併
兩個集合
2-查詢乙個單位;
3-壓縮路徑。
有三種操作:
1:合併兩個集合:
procedure hb(c,p:longint);//兩個集合的合併處
var
hong:longint;
lan:longint;
begin
hong:=getfather(c);
lan:=getfather(p); father[hong]:=father(lan);
end;
其實這也不算是完全合併,時間複雜度就省在只更新乙個點。
而要注意的是,getfather是乙個程式名,pascal不會自帶。
procedure getfather(x:longint);
begin
if father[x]=0 then getfather:=x else begin
getfather:=getfather(father[x]); father[x]:=getfather;
end;
end; 不知道有沒有錯誤,畢竟我才手打出來,(我一定會認真檢查程式!/斜眼笑);如果某位大神路過請看看啊啦啦啦。 接著是查詢(僅僅判斷在不在同一列(呸,好像叫集合吧啦啦)!!!):
function cz(x,y:longint):boolean;
begin
if getfather(x)=getfather(y)
then exit(true) //判斷在不在同乙個集合裡面。 else exit(false); //exit(***x)『***x』就是退出時函式所帶得值。 end; 大致是這樣的。。。。 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
可能排版有問題,因為這個編輯器,咳咳。。。***
開課第八天
開課第八天,今天因為遲到問題被老師訓了,呵呵,說實話是真的感覺前一周有點懶散鬆懈,今天被訓之後又感覺到了緊迫感,嗯,堅持就是勝利,加油。上午講題,下午講新知識,以下就是本寶寶吸收的新養料 方法 可以被稱作函式,也可以被稱作功能。1 main 是我們學習的第乙個簡單的方法,public static ...
彙編第八天
彙編形式目標 main proc push ebp mov ebp,esp 建立堆疊框架 push offset msg 匯入引數位址 call printf 呼叫函式 xor eax,eax 返回0 pop epb 扯掉框架 ret 0 返回主程式 main endp 結束 1.條件語句 cmp ...
前端第八天
迴圈繫結的變數汙染 在進行事件迴圈變數繫結時,由於函式體內部 並未執行,在繫結結束後,呼叫函式時,賦予的部分變數失去意義,解決方案 給頁面元素新增乙個任意屬性 事件與已有的函式進行繫結 只需要將函式位址繫結給事件,事件繫結完成將會有系統在特定情況下自動觸發 物件 字典 的增刪改查 物件元素格式為字串...