CodePlus 第五次網路賽 掐指會算

2021-08-30 19:39:35 字數 4356 閱讀 6617

失蹤人口暫時回歸。

臨近 noip 了,退役選手準備打一打 div.2 來練練手(應該不是天氣冷了,沒衣服穿了 )

遊戲體驗差,oj 又和第一次一樣卡了半天。

根據異或的性質,不難發現 a

aa 矩陣的每行每列最多只能異或一次。

所以我們可以假設 a

aa 矩陣的第一行是否被異或了,然後把所有狀態遞推出來,最後判斷一下是否符合題設。

#include

using

namespace std;

intf()

int n, m, x[

1010

], y[

1010

], a[

1010][

1010

], b[

1010][

1010];

intmain()

memset

(x,0

,sizeof

(x))

;memset

(y,0

,sizeof

(y))

; x[1]

=1;for

(int i =

1; i <= m;

++i)

if(a[1]

[i]== b[1]

[i]) y[i]=1

;for

(int i =

1; i <= n;

++i)

for(

int j =

1; j <= m;

++j)if(

(a[i]

[j]^ y[j]

^ x[i]

)!= b[i]

[j]) x[i]^=

1;flag =1;

for(

int i =

1; i <= n;

++i)

for(

int j =

1; j <= m;

++j)if(

(a[i]

[j]^ x[i]

^ y[j]

)!= b[i]

[j])

flag =1;

if(!flag)

puts

("budexing");

return0;

}

一開始沒看到在詢問的都是葉結點,想了半天。

我想到的是一種構造方式,這種構造方式可以保證所有詢問序列都是必要的,且根結點的取值一定為 111。

假設只有三個點(乙個根和兩個葉子,a

aa 點為先詢問的葉子,b

bb 為後詢問的),假設根的運算子為and,那麼 a

aa 顯然要取值為 1

11,才能保證詢問 b

bb 時不會跳過,若為or,則 a

aa 要為 0

00,按照這樣的取值,根結點的取值就依賴於 b

bb 了。

如果有很多點,我們可以按照詢問的葉子的順序,每次找到這個葉子的祖先第乙個取值還未被確定的點(即這個點的取值不依賴與任意乙個葉子),然後如果是and,則該葉子取值為 1

11,為or則為 000。

需要注意的是如果是最後乙個葉子,那麼對應的祖先一定是根結點,而此時根結點的取值依賴與最後乙個葉子的取值,所以最後乙個葉子取值為 111。

這樣做的複雜度為 o(n

)o(n)

o(n)

,應為每乙個點都只會被找兩次。

#include

using

namespace std;

#define min(_a, _b) (_a < _b ? _a : _b)

#define max(_a, _b) (_a > _b ? _a : _b)

intf()

const

int maxn =

500010

;int next[maxn <<2]

, point[maxn <<1]

, to[maxn <<2]

, q, p[maxn <<1]

;void

add(

int u,

int v)

int n, f[maxn <<1]

[2], p[maxn <<1]

[2], w[maxn <<1]

, l[maxn <<1]

, r[maxn <<1]

, fa[maxn <<1]

;void

dfs(

int u,

int from)

}int ans[maxn]

, pre[maxn]

, q[maxn <<1]

, cnt;

bool vis[maxn]

;int

find

(int u)

intmain()

if(fa[t]

) ans[p[i]]=

!w[fa[t]];

else ans[p[i]]=

1;}for

(int i =

1; i <= n;

++i)

printf

("%d"

, ans[i]);

return0;

}

認真分析題目發現,題目其實是給定一張圖,圖中的每個點要麼屬於 a

aa,要麼屬於 b

bb,告訴你哪些邊連線著不同集合中的元素,求 ∣a∣

|a|∣a

∣。首先看子任務 1

11,一條鏈。我們發現如果有連續的幾個 a

aa 中的元素被夾在 b

bb 中,那麼我們可以利用字尾和的方式,將兩個邊界處的元素的位置相減,得到被夾在中間的 a

aa 中元素的個數。

再來看子任務 2,3

2,32,

3,一棵樹。道理和子任務 1

11 是類似的,我們只需要將字尾和改為子樹和,然後也可以利用加減來得出元素的個數。需要注意你求的集合是否為 aaa。

子任務 4

44,一張圖。找出任意的生成樹,按照樹來做。因為圖給出的邊有很多是沒有價值的,多餘的。

#include

using

namespace std;

intf()

#define abs(_a) (_a > 0 ? _a : -(_a))

const

int maxn =

1000010

, maxm =

2500010

;int n, m, q[

10000010];

struct edge e[maxm]

;int next[maxn <<1]

, to[maxn <<1]

, point[maxn]

, q;

bool vis[maxm]

;void

add(

int u,

int v)

int l[maxn]

, sum[maxn]

, dfn_index;

void

dfs(

int u,

int from)

}int pre[maxn]

;int

find

(int u)

intmain()

;for

(int i =

1; i <= n;

++i) pre[i]

= i;

for(edge *i = e +

1; i <= e + m;

++i)

}dfs(1

,0);

int q;

scanf

("%d"

,&q)

;for

(int i =

1; i <= q;

++i)

bool flag =1;

for(

int j =

1; j <= c;

++j)if(

!flag) tot = n - tot;

printf

("%d\n"

,abs

(tot));

}return0;

}

目測一道計算幾何題,div.2 全場無人 ac,而且還沒部分分(有我應該也寫不出來)

rank 20- 應該是有件衣服過冬了。

ACM第五次積分賽

做出三道題,第二名,總積分上公升到第八名,繼續加油!sau acm總比賽成績 姓名賬號 上學期成績 第一次成績 第二次成績 第三次成績 第四次成績 第五次成績 總成績張國慶 143401010421 20168.8 69.2 6087.2 91.6 577.8 陳福春springhack 201.5...

第五次實驗

一 問題及 檔名稱 陣列素數排序.cpp 作 者 周玉傑 完成日期 2017 年 4 月 24 日 版 本 號 v1.0 對任務及求解方法的描述部分 輸入描述 無 問題描述 程式輸出 問題分析 使用函式來分工 演算法設計 無 include include using namespace std c...

第五次實驗

一 問題及 檔名稱 ex5 1 作 者 謝萍 完成日期 2017年 5月 5 日 版 本 號 v1.0 輸入描述 十個整數 問題描述 從鍵盤中輸入10個數放在陣列a中,將該陣列中奇數放到陣列b,偶數放到陣列c中後分別輸出。程式輸出 陣列中的奇數和偶數 問題分析 先輸入陣列,在進行判斷,最後輸出 演算...