2019 acm-icpc 西安全國邀請賽 j
題意:給一棵樹,x(u,v)為uv兩點件所有邊的異或值
求:
結果取模1e9+7
資料範圍:n<=1e5, 邊權w<=1e18
不太正確的思路(樹上啟發式合併):**用map記錄 每個異或值的子樹大小
在子節點與父節點合併過程中更新答案
合併時採取啟發式合併
注意對每個子節點更新時需先減去子節點對父節點異或值為0的貢獻,計算結束後再加上
特別的:在計算異或值得時候不需要對map內每個點異或,只需對標記陣列進行異或更新,計算答案時異或標記陣列即可
#include
using namespace std;
const
int maxn=
100005
;const
long
long mod=
1e9+7;
long
long ecnt=
1,head[maxn<<1]
;struct edgee[maxn<<1]
;void
add(
long
long u,
long
long v,
long
long w)
long
long siz[maxn]
;int to[maxn]
;long
long jwj[maxn]
,temp;
//jwj為標記陣列
long
long ans=0;
map<
long
long
,long
long
> m[maxn]
;void
dfs(
int x,
int fa)
for(iter=m[to[x]].
begin()
;iter!=m[to[x]].
end(
);iter++
) to[x]
=to[v]
; jwj[x]
=jwj[v]
^w;}
else
for(iter=m[to[v]].
begin()
;iter!=m[to[v]].
end(
);iter++)}
m[to[x]][
0^jwj[x]]+
=siz[v];}
}void
dfs1
(int x,
int fa)
}int
main()
dfs1(1
,0);
dfs(1,
0); cout<
}
以上為5月的我的做法,對樹上問題理解還不夠深刻(雖然現在也不是很深刻),雖然通過了這題,但現在回頭再看這個演算法,仔細考慮會發現用到的空間大小是有問題的,因為對每個點都開了乙個map來存該子樹上由此點開始的所有異或值,空間複雜度是有可能來到 n
2n^2
n2級別的,因此我們重新考慮做法。
由於異或值具有特殊性,如果由同乙個點開始到另外兩個點的鏈上異或值相同,那麼即可以得到這兩個點之間鏈上異或值為0。**也變得簡單清晰明了了很多由這個特性,我們在第一遍dfs時可以處理出由1號點開始到每個點的異或值,之後第二遍dfs只需用乙個map即可進行計數,計數時只需考慮map裡異或值相同的值即可。
特別的,在向子節點v進行dfs過程中,如果temp為到該點的異或值,siz
[v]siz[v]
siz[v]
為子樹v的大小,那麼我們將 map
[tem
p]map[temp]
map[te
mp] 值修改為 n−s
iz[v
]n-siz[v]
n−siz[
v],並在該點子節點都遍歷完後將 map
[tem
p]map[temp]
map[te
mp] 的值修改為 siz
[x]siz[x]
siz[x]
。
#include
using namespace std;
typedef pair<
long
long
,long
long
> p;
long
long siz[
100005
],xx[
100005
],res=
0,mod=
1e9+7;
int n;
vector
e[100005];
unordered_map<
long
long
,long
long
> m;
void
dfs1
(int x)
}void
dfs2
(int x)
m[temp]
+=siz[x];}
intmain()
dfs1(1
);dfs2(1
);cout<
}
2017西安全國邀請賽總結
打完西安邀請賽感覺心有點被打垮了,最近幾天有點頹廢,加之期末不想刷題.思索再三感覺還是應該總結一下.這一次拿了銅獎 參與獎 心有不甘啊,感覺5題是怎麼都有的.一上來我就把兩道簽到題寫了。然後看了一下榜,感覺a,c都是全場題,然後隊友去開了c,我去搞了a推出來發現就是乙個公式,上去交了6次,都是在邊界...
2023年ICPC ACM全國邀請賽 西安 總結
因為學校在西安,所以參加了很多次西安的比賽,但遺憾的是沒有在西安拿過一次牌。這次可能是最後一次參加西安的比賽了,幸運的是湊巧拿到了銅牌。也有不甘吧,可是又能怎麼樣呢,菜是原罪。可能參加完南昌後最要徹底退役了。也許和ec的獎牌無緣了吧。2019年5月27日 雖然參加過那麼多西安賽區,對西工大也很熟悉了...
2019西安邀請賽總結
打鐵了 上來a題我寫的時候過於緊張 以至於慢了好幾分鐘 然後開m 我覺得m就是二分加判斷 出賽場之後一交流確實沒錯,但是我判斷寫的dijistra也不知道 寫錯了 隊友一直在開l zc推錯了規律 最後cly重新按照題目寫了好幾個樣例最後a掉,其實就應該用雜湊儲存集合狀態然後打個表就可以,其實規律題也...