題目鏈結
暑期課第二天
樹上問題高階
具體內容看筆記部落格吧
題意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 6view codeusing
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 }
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 段中哪些在面積有限的塊裡,哪些在面積無限的塊裡。保證第...