某比賽的某些題目

2022-05-05 21:45:11 字數 3644 閱讀 2795

這裡我只寫一些認為應該寫報告的題目。。。像那種5分鐘敲出**的題就不寫了。感謝@xianbin5組織這場比賽,orz

題目1:給一些資料,建議一顆排序二叉樹。然後找到某個節點的祖父節點(父節點的父節點)n <= 50000;

題解:描述很簡單,而且可以很簡單的敲出來。但是注意資料量。。。所以這裡要用到特殊的東西。

乙個顆很神奇的數:笛卡爾樹

笛卡爾樹跟treap結構完全一樣。不過區別在於treap的heap部分是隨機取的,笛卡爾樹的val是之前確定好的。

笛卡爾樹的構造過程:先對資料的key值進行從小到大排序,然後一次插入笛卡爾樹。過程跟treap一樣,不過可以發現,因為資料是排好序的,所以每次插入的節點肯定是在原樹最右側的節點開始找的。這樣就能實現最優甚至接近o(n)的時間建樹。。。。

view code

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define cl(arr, val) memset(arr, val, sizeof(arr))

#define rep(i, n) for((i) = 0; (i) < (n); ++(i))

#define for(i, l, h) for((i) = (l); (i) <= (h); ++(i))

#define ford(i, h, l) for((i) = (h); (i) >= (l); --(i))

#define l(x) (x) << 1

#define r(x) (x) << 1 | 1

#define mid(l, r) (l + r) >> 1

#define min(x, y) x < y ? x : y

#define max(x, y) x < y ? y : x

#define e(x) (1 << (x))

const

int eps = 1e-6

;const

int inf = ~0u>>2

;;typedef

long

long

ll;using

namespace

std;

const

int n = 50010

;map

mp;struct

node p[n];

bool

operator

< (const node& a, const node&b)

void build_tree(int

n) }

intmain()

for(i = 1; i <= n; ++i)

sort(p + 1, p + n + 1

);

for(i = 1; i <= n; ++i)

build_tree(n);

while(m--)

x =p[x].pre;

if(p[x].pre == 0)

x =p[x].pre;

printf(

"%d\n

", p[x].key);}}

return0;

}

題目2:給出由'0','1','2','3','?'組成的串a,b,c。其中'?'表示該位可能是0,1,2,3,若有a+b=c,則稱[a,b,c]是這三個字串的一組解,給出a,b,c,求解的個數。

題解:這題很容易想到模擬。不過我寫的模擬沒過。。。還有更好的方法。。。dp

dp[i][0]表示第i位沒有進製的情況數。

dp[i][1]表示第i位有進製時的情況數。

然後對每一位進行模擬加法

view code

string

a, b, c;

int dp[20][2

];int

solve() }}

}}

}return dp[m][0];}

intmain()

return0;

}

題目3:給乙個數n,找出[1, n]中包含因子個數最多的數,如果這個數有多個,找最小的那乙個。

題解:對n分解質因子 n = p1^k1 * p2^k2 * ..... 所以n的因子數為 (k1 + 1)*(k2 + 1) *(k3 + 1) * ....

可以反過來,不去分解質因子,而是用這些素數去組合,列舉出1-n中所有數有多少個質因子

其實前邊這些已經可以解決這個問題了,不過還有乙個規律進行優化。

12 = 3 * 2^2 18 = 3^2 * 2;

12 < 18,可以在列舉時進行乙個優化,使得列舉到的數字中2的指數不小於3的指數,3的指數不小於5的指數……這樣我們就能夠得到質因數分解「模式」相同的最小數(證明略)。再對於每乙個得到的數進行比較和記錄。

view code

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define cl(arr, val) memset(arr, val, sizeof(arr))

#define rep(i, n) for((i) = 0; (i) < (n); ++(i))

#define for(i, l, h) for((i) = (l); (i) <= (h); ++(i))

#define ford(i, h, l) for((i) = (h); (i) >= (l); --(i))

#define l(x) (x) << 1

#define r(x) (x) << 1 | 1

#define mid(l, r) (l + r) >> 1

#define min(x, y) x < y ? x : y

#define max(x, y) x < y ? y : x

#define e(x) (1 << (x))

const

int eps = 1e-6

;const

int inf = ~0u>>2

;;typedef

long

long

ll;using

namespace

std;

int prime[12] = ;

int_max, num, n;

void solve(int m, int t, int f, int

limt)

j = 0; l = 1; i =m;

while(i <= n && j

}int

main()

}return0;

}

題目 H 小明的比賽

題目描述 小明的演算法競賽水平很高,他經常參加網上的比賽。比賽的規則是這樣的 要在規定時間內解決 n 道題,解決時間越晚失去的分數就越多。當然如果有錯誤提交還會扣額外的分數。為了簡化題目,我們假設小明所有題目都可以一遍 ac。小明實在是太強了,以致於他看完所有題目就都會做了。剩下的就是把它們寫出來的...

程式比賽的題目回憶

有這樣乙個選擇題 如cc繼承了yy cc裡面宣告了乙個私有的成員變數賦值 string name zhangsna 有乙個main函式,new 之後,輸出物件名.getname yy是它的子類。它也有個私有成員變數。賦值 string name lisi 題目是,執行結果是 zhangsna lis...

某道 EGF 題目

有 n m k 盞燈,各有不同的編號與開關。其中有 n 盞亮著的,m 盞暗燈,k 棧壞的燈。亮燈按下開關將變成暗燈,暗燈按下開關將變成亮燈,壞燈無論如何按開關都是暗燈。求操作嚴格 t 次後,所有燈都是暗燈的方案數。結果對 10 9 7 取模。n,m leq 5 times 10 3,t,k leq ...