NOIP2015模擬10 28B組 終章 劍之魂

2021-07-10 09:35:33 字數 1699 閱讀 3518

題目介紹:

【背景介紹】

古堡,闇鴉,斜陽,和深淵……

等了三年,我獨自一人,終於來到了這裡……

「終焉的試煉嗎?就在這裡嗎?」我自言自語道。

「終焉的試煉啊!就在這裡啊!」我再一次自言自語道。

「這背後可能有那個東西嗎?」我自言自語道。

「這背後一定有那個東西呢!」我又一次自言自語道。

我沉默著,踏上黑漆漆的索橋,小心翼翼地,拿出鋒利的注入我靈魂的雙劍……

「那麼,我們開始吧……」我最後一次自言自語道。

【題目描述】

my soul of my sowrd!

終焉的試煉即將到來,作為一名有修養的劍士,雖然沒有習得n刀流但是二刀流還是沒問題的。然而我也是個劍的收藏者,家裡屯著n把劍,每一把劍都有乙個靈魂值a[i],由於一些劍之間可能有共鳴,所以我需要兩把契合度最高的劍。據劍聖所說,兩把編號為i,j劍的契合度為a[i] and a[j]。如何深得劍的靈魂呢?

注:and 為按位與運算,先將數轉成二進位制,不滿位數的補全0,然後成為兩個長度相同的二進位制數,處理的時候,兩個相應的二進位制位都為1,該位的結果值才為1,否則為0。

n ≤ 1,000,000,0 ≤ a[i] < 2^31

———————————–華麗分割線————————————

題目簡述:給一堆數,求其中最大的任意兩個數的and值。 及求max(a[i] and a[j])。

——————————–現在告訴你—————————————

思路:

因為這個n<=106

,所以要是n2

的話你可以看看你的電腦是否有高配的計算速度。

考慮到這a[i]的位數頂死只有31位,又和位運算有關,我們可以分位考慮。

正解

兩個數and後,要使其最大,就是讓越高為為1越好,所以我們可以從高往低搜。遵循以下兩個原則即可更行答案。

設現在選的答案為ans,當前正在選第i位,當前的數為a[j]。

1:a[j]必須與之前所選的每一位都要符合,即:a[j]&ans=ans;

2:a[j]的第i位必須為1,即:a[j]&(2^(i-1))=2^(i-1);

符合這兩個條件就可以的a[j]如果超過兩個就可以更新答案了。

時間複雜度:o(31*n); 空間複雜度:o(n);

#include

#include

#define fo(i,a,b) for(int i=a; i<=b; i++)

#define fod(i,a,b) for(int i=a; i>=b; i--)

using

namespace

std;

const

int maxn=1000005;

int n;

long

long a[maxn],ans;

int main()

printf("%lld",ans);

}

—————————華麗分割線——————————————-那麼第一次寫就這樣結束了,中途中我還問了不少的人這個符號那個符號怎麼打。不過打完後覺得挺爽的。

NOIP2015模擬11 5 旅行

經過觀察,可以發現題目有乙個比較不錯的性質 1 一條合法的路徑必須由兩條路徑組成,一條是奇數,另一條是偶數。所以我們可以先把每乙個點到達根節點的路徑求出來,深度為奇數的點放進乙個a aa陣列裡,偶數的放進b bb陣列裡,再給他們分別進行排序。然後進行兩兩結合,先把a陣列裡的所有數跟b1b b1 結合...

NOIP2015模擬11 3 裝飾大樓

給出乙個序列a,ai表示對於乙個h序列來講,以i結尾的lis的長度。h中的數兩兩不等。現在你知道了a刪去乙個數之後的序列b 未知刪掉哪位 求a序列有多少種。a 10 6 好多細節呀!不爽,懶得打題解。可以發現,對於乙個序列a,它滿足條件的前提就是,對於每乙個ai,都存在乙個aj j i 滿足aj 1...

NOIP2015模擬11 3 備用鑰匙

你知道just odd inventions社嗎?這個公司的業務是 只不過是奇妙的發明 just odd inventions 這裡簡稱為joi社。joi社有n名員工,編號從1到n。所有員工的工作時間從時刻0持續到時刻m,時刻0和時刻m的時候,所有員工都必須在公司內。某天,出於巧合,joi社的每個員...