日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

        歡迎訪問 生活随笔!

        生活随笔

        當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

        编程问答

        UOJ207 共价大爷游长沙

        發布時間:2023/12/2 编程问答 32 豆豆
        生活随笔 收集整理的這篇文章主要介紹了 UOJ207 共价大爷游长沙 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

        考慮到路徑是有向的,不是很好維護。
        如果路徑無向的話,可以直接轉化為鏈加和查詢操作。
        既然有向的話,不妨考慮一波hash。
        對于一組詢問x,y,可以把樹劃分為兩顆子樹。
        合法顯然需要滿足
        x子樹的起點的hash=y子樹的終點的hash
        x子樹的終點的hash=y子樹的起點的hash
        直接用LCT維護一個異或hash即可。

        #include<iostream> #include<cctype> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<ctime> #include<cstdlib> #include<algorithm> #define N 330000 #define L 300000 #define eps 1e-7 #define inf 1e9+7 #define db double #define ll long long #define ldb long double using namespace std; inline int read() {char ch=0;int x=0,flag=1;while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*flag; } #define lson son[x][0] #define rson son[x][1] struct lnk{int x,y,z;}p[N]; int va[N],vb[N],sa[N],sb[N],sa_[N],sb_[N],f[N],st[N],flag[N],son[N][2]; bool get(int x){return son[f[x]][1]==x;} bool isroot(int x){return (son[f[x]][0]!=x)&&(son[f[x]][1]!=x);} void pushup(int x) {sa[x]=sa[lson]^sa[rson]^sa_[x]^va[x];sb[x]=sb[lson]^sb[rson]^sb_[x]^vb[x]; } void update(int x){flag[x]^=1;swap(lson,rson);} void pushdown(int x){if(!flag[x])return;if(lson)update(lson);if(rson)update(rson);flag[x]=0;} void rotate(int x) {int y=f[x],z=f[y],tx=get(x),ty=get(y),p=son[x][!tx];if(!isroot(y))son[z][ty]=x;son[x][!tx]=y;son[y][tx]=p;if(p)f[p]=y;f[y]=x;f[x]=z;pushup(y);pushup(x); } void splay(int x) {int cnt=0,tmp=x;st[++cnt]=x;while(!isroot(x))st[++cnt]=f[x],x=f[x];for(int i=cnt;i>=1;i--)pushdown(st[i]);x=tmp;while(!isroot(x)){int y=f[x];if(!isroot(y))rotate(get(x)==get(y)?y:x);rotate(x);}pushup(x); } void access(int x) {for(int y=0;x;y=x,x=f[x]){splay(x);sa_[x]^=sa[rson];sb_[x]^=sb[rson];rson=y;sa_[x]^=sa[rson];sb_[x]^=sb[rson];pushup(x);} } void makeroot(int x){access(x);splay(x);update(x);} void link(int x,int y) {makeroot(x);access(y);splay(y);f[x]=y;sa_[y]^=sa[x];sb_[y]^=sb[x];pushup(y); } void cut(int x,int y) {makeroot(x);access(y);splay(y);f[x]=son[y][0]=0;pushup(y); } void add1(int x,int k){makeroot(x);va[x]^=k;pushup(x);} void add2(int x,int k){makeroot(x);vb[x]^=k;pushup(x);} int rng(){int x=0;for(int i=0;i<=30;i++)x^=(rand()%2)<<i;return x;} int main() {srand(time(0));read();int n=read(),m=read(),cnt=0,s=0;for(int i=1;i<n;i++){int x=read(),y=read();link(x,y);}for(int i=1;i<=m;i++){int flag=read();if(flag==1){int x,y;x=read();y=read();cut(x,y);x=read();y=read();link(x,y);}if(flag==2){cnt++;p[cnt].x=read();p[cnt].y=read();p[cnt].z=rng();add1(p[cnt].x,p[cnt].z);add2(p[cnt].y,p[cnt].z);s^=p[cnt].z;}if(flag==3){int k=read();add1(p[k].x,p[k].z);add2(p[k].y,p[k].z);s^=p[k].z;}if(flag==4){int x=read(),y=read();makeroot(x);access(y);int a=sa_[y]^va[y],b=sb_[y]^vb[y]; if((a^b)==s)printf("YES\n");else printf("NO\n");}}return 0; }

        轉載于:https://www.cnblogs.com/Creed-qwq/p/10354399.html

        總結

        以上是生活随笔為你收集整理的UOJ207 共价大爷游长沙的全部內容,希望文章能夠幫你解決所遇到的問題。

        如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。