失蹤人口暫時回歸。
臨近 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中後分別輸出。程式輸出 陣列中的奇數和偶數 問題分析 先輸入陣列,在進行判斷,最後輸出 演算...