UOJ 192 UR 14 最強跳蚤

2022-05-07 10:06:10 字數 1609 閱讀 2640

題目鏈結 

暑期課第二天

樹上問題高階

具體內容看筆記部落格吧 

題意n個節點的樹t 邊有邊權w 求滿足(u, v)上所有邊權乘積為完全平方數的路徑有多少條

看到「所有邊權乘積為完全平方數」 想到完全平方數的特殊性

就是分解質因數後 質因數指數都為偶數

然後就想到分解邊權質因數+判質路徑邊權奇偶性

後者由於奇數偶數的和的規律 可以使用抑或

偶就表示為0 奇就表示為一

那麼如何儲存呢?

狀壓?空間之大 狀壓壓不下

所以hash 

對每乙個要用的質數 取乙個 [1, 2 ^ 64] 的隨機數

出現一次就抑或一次即可

然後。。。

題意n個節點的樹t 邊有邊權w 求滿足(u, v)上所有邊權抑或和為0的路徑有多少條

字首和最常用的兩種 一是累加和 二是抑或和

明顯可以使用字首和

又由於 a ^ a = 0

對於一條路徑 (路徑兩端點的lca) 到 (根節點)的那一段抑或兩次沒啦

所以如果(u, v)上所有邊權抑或和為0

那麼他們的抑或字首和相等

以下附莫名被ex扣下3分的辣雞**

1 #include 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;

7const

int n = 2e5 + 5;8

const

int m = 1e4 + 5;9

10int

n, m;

11struct

edgeedge[n << 1

];16

intesize, head[n];

17long

long p[m + 5

], ps;

18bool

np[m];

19long

long

num[n];

20 map

long>rf;

2122 inline void addedge(int x, int y, long

long

z);24 head[x] =esize;25}

2627 inline void

p_cal()34}

35}3637 inline void build(int x, int

fa)44}45

46int

main()

68addedge(x, y, res); addedge(y, x, res);

69}

7071 build(1, -1

);72 sort(num + 1, num + n + 1

);73

long

long ans = 0;74

for(int i = 1, j; i <= n; i =j)

79 printf("

%lld

", ans);

80return

0;

81 }

view code

UOJ 192 UR 14 最強跳蚤

這道題本來不想寫部落格的 但是鑑於自己犯了低階錯誤,還是寫篇部落格記載一下。一開始我的想法和題解裡面的演算法而比較類似,也是先分解質因數,然後用質因子是否出現偶數次來判斷當前這個數是否是完全平方數 然而這樣並不能ac,於是我去翻了題解 get 了乙個新做法,就是給每個出現過的質因子賦乙個 0,2 的...

uoj 513 UR 19 清掃銀河

很簽到題 操作2先假設全部為黑,那麼變成了每選乙個點便會取反相連的邊 如果能暴力搞出所有環就可以高斯消元判斷,也許能過40 對原圖建dfs樹,發現只需要保留返祖邊加上對應路徑的環即可,任何的環都可以通過這些環異或得到,於是環的個數變為m級別,高斯消元o m 3 可以70 設返祖邊 u,v,w 的選擇...

UOJ 242 UR 16 破壞蛋糕

一句話題意 平面上有 n 1條直線,前 n 條直線把平面分成許多塊,這些塊有些面積有限,有些面積無限,而第 n 1 條直線不經過前 n 條直線的交點,且一定不和前 n 條直線中的任意一條平行,求第 n 1 條直線被前 n 條直線劃分成的 n 1 段中哪些在面積有限的塊裡,哪些在面積無限的塊裡。保證第...