NOIP2023年提高組複賽上機試題

2021-09-29 20:58:43 字數 4048 閱讀 9532

通常,人們習慣將所有 n 位二進位制串按照字典序排列,例如所有 2 位二進位制串按字典序從小到大排列為:00,01,10,11。

格雷碼(gray code)是一種特殊的 n 位二進位制串排列法,它要求相鄰的兩個二進位制串間恰好有一位不同,特別地,第乙個串與最後乙個串也算作相鄰。

所有 2 位二進位制串按格雷碼排列的乙個例子為:00,01,11,10。

n 位格雷碼不止一種,下面給出其中一種格雷碼的生成演算法:

1 位格雷碼由兩個 1 位二進位制串組成,順序為:0,1。

n+1 位格雷碼的前 2n 個二進位制串,可以由依此演算法生成的 n 位格雷碼(總共 2n 個 n 位二進位制串)按順序排列,再在每個串前加乙個字首 0 構成。

n+1 位格雷碼的後 2n 個二進位制串,可以由依此演算法生成的 n 位格雷碼(總共 2n 個 n 位二進位制串)按逆序排列,再在每個串前加乙個字首 1 構成。

綜上,n+1 位格雷碼,由 n 位格雷碼的 2n 個二進位制串按順序排列再加字首 0,和按逆序排列再加字首 1 構成,共 2n+1 個二進位制串。

另外,對於 n 位格雷碼中的 2n 個二進位制串,我們按上述演算法得到的排列順序將它們從 0 ∼ 2n−1 編號。

按該演算法,2 位格雷碼可以這樣推出:

已知 1 位格雷碼為 0,1。

前兩個格雷碼為 00,01。後兩個格雷碼為 11,10。合併得到 00,01,11,10,編號依次為 0 ∼ 3。

同理,3 位格雷碼可以這樣推出:

已知 2 位格雷碼為:00,01,11,10。

前四個格雷碼為:000,001,011,010。後四個格雷碼為:110,111,101,100。合併得到:000,001,011,010,110,111,101,100,編號依次為 0 ∼ 7。

現在給出 n,k,請你求出按上述演算法生成的 n 位格雷碼中的 k 號二進位制串。

輸入格式

僅一行,包含兩個整數 n 和 k。

輸出格式

僅一行,乙個 n 位二進位制串表示答案。

資料範圍

對於 50% 的資料:n≤10

對於 80% 的資料:k≤5×106

對於 95% 的資料:k≤263−1

對於 100% 的資料:1≤n≤64,0≤k<2n

輸入樣例1:

2 3輸出樣例1

10
輸入樣例2

3 5
輸出樣例2

111
樣例解釋對於樣例1,2 位格雷碼為:00,01,11,10,編號從 0 ∼ 3,因此 3 號串是 10。

對於樣例2,3 位格雷碼為:000,001,011,010,110,111,101,100,編號從 0 ∼ 7,因此 5 號串是 111。

ac**

#include

#include

#include

using

namespace std;

typedef

unsigned

long

long ull;

string f

(int n, ull k)

}int

main()

本題中合法括號串的定義如下:

() 是合法括號串。

如果 a 是合法括號串,則 (a) 是合法括號串。

如果 a,b 是合法括號串,則 ab 是合法括號串。

本題中子串與不同的子串的定義如下:

字串 s 的子串是 s 中連續的任意個字元組成的字串。s 的子串可用起始位置 l 與終止位置 r 來表示,記為 s(l,r)(1≤l≤r≤|s|,|s| 表示 s 的長度)。

s 的兩個子串視作不同當且僅當它們在 s 中的位置不同,即 l 不同或 r 不同。

乙個大小為 n 的樹包含 n 個結點和 n−1 條邊,每條邊連線兩個結點,且任意兩個結點間有且僅有一條簡單路徑互相可達。

小 q 是乙個充滿好奇心的小朋友,有一天他在上學的路上碰見了乙個大小為 n 的樹,樹上結點從 1 ∼ n 編號,1 號結點為樹的根。

除 1 號結點外,每個結點有乙個父親結點,u(2≤u≤n)號結點的父親為 fu(1≤fu小 q 發現這個樹的每個結點上恰有乙個括號,可能是( 或)。

小 q 定義 si 為:將根結點到 i 號結點的簡單路徑上的括號,按結點經過順序依次排列組成的字串。

顯然 si 是個括號串,但不一定是合法括號串,因此現在小 q 想對所有的 i (1≤i≤n) 求出,si 中有多少個互不相同的子串是合法括號串。

這個問題難倒了小 q,他只好向你求助。

設 si 共有 ki 個不同子串是合法括號串,你只需要告訴小 q 所有 i×ki 的異或和,即:

其中 xor 是位異或運算。

輸入格式

第一行乙個整數 n,表示樹的大小。

第二行乙個長為 n 的由 ( 與 ) 組成的括號串,第 i 個括號表示 i 號結點上的括號。

第三行包含 n−1 個整數,第 i(1≤i輸出格式

僅一行乙個整數表示答案。

資料範圍

輸入樣例:

5

(()()

1 1 2 2

輸出樣例:

6
樣例解釋

樹的形態如下圖:

將根到 1 號結點的簡單路徑上的括號,按經過順序排列所組成的字串為 (,子串是合法括號串的個數為 0。

將根到 2 號結點的簡單路徑上的括號,按經過順序排列所組成的字串為 ((,子串是合法括號串的個數為 0。

將根到 3 號結點的簡單路徑上的括號,按經過順序排列所組成的字串為 (),子串是合法括號串的個數為 1。

將根到 4 號結點的簡單路徑上的括號,按經過順序排列所組成的字串為 (((,子串是合法括號串的個數為 0。

將根到 5 號結點的簡單路徑上的括號,按經過順序排列所組成的字串為 ((),子串是合法括號串的個數為 1。

ac**

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n =

500010

;int n;

char str[n]

;int h[n]

, e[n]

, ne[n]

, idx;

ll f[n]

, g[n]

;int p[n]

, stk[n]

, top;

void

add(

int a,

int b)

void

dfs(

int u)

else

else}}

intmain()

dfs(1)

; ll res =0;

for(

int i =

1; i <= n; i ++

) res ^

= f[i]

* i;

printf

("%lld\n"

, res)

;return0;

}

NOIP2019提高組模擬 購物(題解)

強烈譴責 這道題不符合生活常識,優惠卷面額的作用竟然不是扣多少錢的而是扣到多少錢,巨坑!關鍵是樣例還能過,mmp 題解 這道題可以採用貪心的思想,把優惠了的和沒優惠的所以合成乙個陣列在一起算,一起sort一下,然後就要堅持乙個商品只能買一次的原則,將每個要選的優惠後的 標記一波,不選它的原來 而且要...

noip2019提高組 Emiya 家今天的飯

題面 這裡思路 一道很妙的dp題,首先可以發現至多有一種主要食材被選超過t 2次,所以考慮用容斥 合法方案 總方案數 每行的不合法方案數。顯然 求出確定的某一列不合法的方案數比求出每一行都合法的方案數要簡單得多 範圍減小,限制更明確 這也是容斥的基本思路 正難則反.根據這個可以列出樸素的dp轉移方程...

NOIP2019複賽模擬11 day2

trape 出題人真的是太有毒了!題意在搞什麼!qaq 梯形只存在橫向放著,沒有亂七八糟旋轉 題解 列舉下底邊,使左右邊界不斷右移即可。可以使用單調佇列 include using namespace std int a 5200 5200 intmain cout return0 rcomb 一開...