CCF 201912 4 區塊鏈 滿分題解

2021-10-23 22:35:01 字數 3308 閱讀 4224

我們可以將主鏈看做網路傳輸中傳送的資料報,節點在產生塊或收到鄰居發來的包(主鏈)並更新後,會向鄰居節點傳送自己的包,這裡假設傳送時刻為t,鏈路延遲為interval,當前時刻為cur,那麼鄰居節點只有在t+interval=cur時才能恰好收到這個包,我們當然可以構造乙個結構體

struct packet

;

來儲存這個包,其中link代表傳送的主鏈,t代表送達時刻(即傳送時刻+鏈路延遲interval),這樣就可以通過判斷t是否小於cur來確定這個包是否過期。

那麼有人可能會想,那我用乙個packet型別的陣列來儲存每個節點發出的資料報,下標就代表這個節點編號,可以嗎?答案是否定的!因為鏈路是有容量的,如果節點u在t時刻傳送乙個資料報後,又在t~t+interval的時間段內連續傳送了多個資料報,這樣所有的資料報都沒有送達(或者說都在路上),那麼我們用什麼來儲存這些資料報呢?可以用雙向佇列deque來儲存(至於為什麼是雙向的,到後面就會知道)。每傳送乙個資料報,就從佇列後端壓入乙個資料報,當資料報過期(t使用mp[cur]儲存cur時刻所有傳送方編號,因為每個節點每一秒都有可能收到資料報,因此我們需要寫乙個傳遞函式,來更新生成下一秒圖的狀態,遍歷當前時刻所有傳送方,根據提給條件和資料報更新鄰居的主鏈。

每次查詢(或生成塊)前我們需要把圖的狀態傳遞到查詢(或生成塊)的時刻,即一直傳遞到t==cur時,再進行查詢(或生成塊)的操作。

// 201912-4 區塊鏈.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。

//#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);

#include

#include

#include

#include

#define maxn 510

#define maxm 10010

using

namespace std;

int n, m, cnt;

//n個點,m條邊

int cur;

//當前時間

int interval;

struct packet

;struct edge

edge[maxm <<1]

;int head[maxn]

;vector<

int> node[maxn]

;//資料報佇列

deque que[maxn]

;//資料報時刻佇列

deque<

int> tque;

void

sendpacket

(int i,

int t)

//傳送節點i,傳送時刻t;if

(!que[i]

.empty()

&& que[i]

.back()

.t == p.t)

//清除過期資料報

que[i]

.pop_back()

; que[i]

.push_back

(p);

if(tque.

empty()

|| tque.

back()

!= p.t)

//更新資料報時刻佇列

tque.

push_back

(p.t);}

void

transmitonesec()

if(!que[u]

.empty()

&& que[u]

.front()

.t == cur)}}

if(flag)

sendpacket

(i, cur)

;//接收完鄰居的資料報後向外傳遞資料報}}

void

transmittocurrent

(int t)

}//a在t時刻產生了編號為c的塊

void

generate

(int a,

int t,

int c)

void

search

(int a,

int t)

cout << endl;

}void

init()

}void

addedge

(int u,

int v)

intmain()

cur =0;

cin >> interval >> k;

for(

int i =

0; i < k; i++

)else

}}

5 10

1 21 3

1 41 5

2 32 4

2 53 4

3 54 5

1 27

1 1 1

2 1 2

3 1 3

4 1 4

5 1 5

1 12 1

3 14 1

5 11 2

2 23 2

4 25 2

1 10 10

2 11 9

1 11

2 11

3 11

4 11

5 11

1 12

2 12

3 12

4 12

5 12

15 13

1 22 3

3 44 5

1 66 7

7 88 9

1 10

10 11

11 12

12 13

14 15

6 28

1 1 1

1 2 2

1 62 7

13 7

9 75 7

3 14

8 14

5 14

11 14

9 25

5 25

13 25

9 29 3

5 29 4

13 29 5

1 53

2 59 6

2 59

1 1000

3 1000

8 1000

9 1000

10 1000

13 1000

14 1000

15 1000

CCF 201912 4 區塊鏈(STL模擬)

好難寫的一道題,一開始寫是每次記錄下每個時間的被傳輸鏈和新增塊,然後每更新一次bfs全圖,但是寫不對。下面的 是參考 include include include include include include include include include using namespace std...

csp 201912 4區塊鏈 80分

思路直接利用優先佇列,將每一次會對外傳播的節點當前的狀態記住,同時也儲存這次傳播會到達的時間 每次產生和輸出之前先更新就可以,但是因為乙個節點可能在同一時間生成多個塊,會被卡時間,只能得到80分,後續優化懶得做了 附贈一組測試資料 15 13 1 22 3 3 44 5 1 66 7 7 88 9 ...

區塊鏈系列1 區塊鏈科普

區塊鏈本質上是乙個賬本,當乙個商品 乙個行為 乙個交易開始的時候,可以產生乙個區塊,它的整個流動的生命週期被詳細的記錄下來,形成乙個鏈。這個賬本會存在網際網路上,理論上無法被任何人拿走 篡改或者銷毀。優點 1.分布式,去中心化 拿位元幣來講,去中心化的好處就是不需要有乙個類似銀行的機構來為雙方交易提...