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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

YBTOJ洛谷P4074:糖果公园(树上莫队)

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 YBTOJ洛谷P4074:糖果公园(树上莫队) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 解析
    • update:
  • 代碼

所謂樹上莫隊,就是在樹上的莫隊

(逃)
傳送門

解析

似乎就是樹上的這道題
考慮如何轉化為序列問題呢?
考慮dfs序
但是又一個問題。。。
似乎這條鏈的dfs序不連續啊
樹剖一下就好啦
考慮更陽間的方法
求出這棵樹的歐拉序,在這個歐拉序上詢問
那么我們發現,這樣的話,其實會多算的部分就都會多算2遍
比如樣例:

以1為根,歐拉序為:
13442231
那么我們考慮(4-3)
對應的序列就是:

44223

不在路徑上的2恰好算了2次
所以我們可以利用異或的性質
還有一些特判的問題:

  • lca不在端點時,需要額外計算lca
  • 左端點不時lca時,需要額外計算左端點
    畫畫圖就很清楚了
  • update:

    上面那個特判是洛谷野生題解的,有點過于陰間了…
    ybt的實現優美的多(至少易于記憶)
    設一個點進入和離開dfs的時間分別為 in(x),out(x)in(x),out(x)in(x),out(x)
    in(x)<in(y)in(x)<in(y)in(x)<in(y),分情況討論:

  • xxxyyy 的祖先,那么答案就是 [in(x),in(y)][in(x),in(y)][in(x),in(y)]
  • xxx 不是 yyy 的祖先,那么在 [out(x),in(y)][out(x),in(y)][out(x),in(y)] 的基礎上,還要加上 lca(x,y)lca(x,y)lca(x,y)
  • 代碼

    #include<bits/stdc++.h> using namespace std; #define ll long long const int N=3e5+100; const int M=1050; const int mod=998244353; const double eps=1e-6; ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f; } int n,m; struct node{int to,nxt; }p[N<<1]; int fi[N],cnt; void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt; } int pl[N][22],dep[N],siz[N]; ll v[N],w[N]; int pos[N],dfn[N],ed[N],Tim; void dfs(int x,int f){pl[x][0]=f;pos[x]=++Tim;dfn[Tim]=x;siz[x]=1;for(int k=1;k<=18;k++) pl[x][k]=pl[pl[x][k-1]][k-1];for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f) continue;dep[to]=dep[x]+1;dfs(to,x);siz[x]+=siz[to];}dfn[++Tim]=x;ed[x]=Tim; } bool vis[N]; int a[N],tim,tot,from[N],to[N],id[N],bel[N]; int Lca(int x,int y){if(dep[x]<dep[y]) swap(x,y);for(int k=18;k>=0;k--){if(!pl[x][k]||dep[pl[x][k]]<dep[y]) continue;x=pl[x][k];} // printf("LCA:x=%d y=%d ",x,y);if(x==y){ // printf("ares=%d\n",x);return x;} // printf(" mid:x=%d y=%d ",x,y);for(int k=18;k>=0;k--){if(pl[x][k]==pl[y][k]) continue;x=pl[x][k];y=pl[y][k];} // printf("x=%d res=%d\n",x,pl[x][0]);return pl[x][0]; } struct query{int l,r,t,id,lca;bool operator < (const query o)const{if(bel[l]!=bel[o.l]) return bel[l]<bel[o.l];else if(bel[r]!=bel[o.r]) return bel[r]<bel[o.r];else return t<o.t;} }ask[N]; int l,r,t,bac[N]; ll now; ll ans[N]; inline void work(int x){x=dfn[x];(vis[x]^=1)?now+=v[a[x]]*w[++bac[a[x]]]:now-=v[a[x]]*w[bac[a[x]]--]; } int q; int ww; int main(){memset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();q=read();for(int i=1;i<=m;i++) v[i]=read();for(int i=1;i<=n;i++) w[i]=read();for(int i=1;i<n;i++){int x=read(),y=read();addline(x,y);addline(y,x);}for(int i=1;i<=n;i++) a[i]=read();dep[1]=1;dfs(1,0); // for(int i=1;i<=Tim;i++) printf("%d ",dfn[i]); // printf("\n");ww=floor(pow(Tim,2.0/3));for(int i=1;i<=Tim;i++){bel[i]=(i-1)/ww+1;}for(int i=1;i<=q;i++){int op=read(),x=read(),y=read();if(op==0){++tim;int o=x;from[tim]=a[o];id[tim]=o;a[o]=y;to[tim]=a[o];}else{if(pos[x]>pos[y]) swap(x,y);ask[++tot]=(query){pos[x],pos[y],tim,tot,pos[Lca(x,y)]};} // printf("i=%d op=%d x=%d y=%d\n",i,op,x,y);}sort(ask+1,ask+1+tot);l=1;t=tim;for(int i=1;i<=tot;i++){int nl=ask[i].l,nr=ask[i].r,nt=ask[i].t,lca=ask[i].lca;while(l<nl) work(l++);while(l>nl) work(--l);while(r<nr) work(++r);while(r>nr) work(r--);while(t<nt){t++;int o=id[t],f=0;if((pos[o]<l&&l<=ed[o]&&ed[o]<=r)) f=1;else if(l<=pos[o]&&pos[o]<=r&&r<ed[o]) f=2;if(f==1) work(ed[o]);else if(f==2) work(pos[o]);a[o]=to[t];if(f==1) work(ed[o]);else if(f==2) work(pos[o]);}while(t>nt){int o=id[t],f=0;if((pos[o]<l&&l<=ed[o]&&ed[o]<=r)) f=1;else if(l<=pos[o]&&pos[o]<=r&&r<ed[o]) f=2;if(f==1) work(ed[o]);else if(f==2) work(pos[o]);a[o]=from[t];if(f==1) work(ed[o]);else if(f==2) work(pos[o]);t--;}if(nl!=lca){work(nl);if(nr!=lca) work(lca);} // printf("id=%d (%d %d %d %d) res=%lld\n",ask[i].id,nl,nr,nt,lca,now);ans[ask[i].id]=now;if(nl!=lca){work(nl);if(nr!=lca) work(lca);}}for(int i=1;i<=tot;i++) printf("%lld\n",ans[i]);return 0; } /**/ 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的YBTOJ洛谷P4074:糖果公园(树上莫队)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 国产成人欧美一区二区三区91 | 精品国产污污免费网站入口 | 免费国产 | 日韩三级网 | 久久久久亚洲av成人无码电影 | 欧美精品入口蜜桃 | 中文字幕一区二区三区5566 | 中文字幕免费高清 | 曰本三级日本三级日本三级 | 亚洲三级av | 亚洲大片 | 毛片成人 | 亚洲人在线观看视频 | 亚洲欧美中文字幕 | 久久性生活 | 日韩乱码一区二区三区 | 久久亚洲欧美 | 国产亚洲精品精品精品 | 高潮毛片无遮挡免费看 | 亚洲精品一区二区三区区别 | 99这里只有精品 | 色伊人av | 在线观看日本 | 天天操欧美 | 国产青青视频 | 99re在线播放 | 日韩欧美大片 | 波多野结衣在线免费观看视频 | 少妇一区二区三区四区 | 亚洲欧美在线一区二区 | 高清国产午夜精品久久久久久 | 欧美精品一区二区三区四区 | 欧美亚洲成人网 | www.蜜臀| 欧美hdse | 国产午夜在线观看 | 亚洲欧洲日本国产 | 96久久精品 | 粉嫩av一区二区三区免费观看 | 男生和女生差差的视频 | 中文字幕在线免费视频 | 亚洲激情影院 | 国产suv精品一区二区68 | 男女超碰 | 亚洲av片不卡无码久久 | 黄色一级网 | 色盈盈影院 | 无码人妻久久一区二区三区不卡 | 亚洲AV无码国产精品国产剧情 | 日日骑 | 黄色av资源| 中国少妇初尝黑人巨大 | 日本黄色片| www亚洲精品 | 国产一区二区三区免费在线观看 | 黄色大片儿 | 中国大陆高清aⅴ毛片 | 萌白酱在线观看 | 精品h视频 | 老师的肉丝玉足夹茎 | 少妇29p | 日本少妇xxxxxx | 亚洲国产精品99 | 亚洲av综合色区无码一区爱av | 无码熟妇人妻av | 中文字幕二区三区 | 中文在线免费看视频 | 视频在线看 | 91精品国产成人www | 国产精品va| 可以免费看黄的网站 | 天天干干干干干 | 在线播放一区 | 亚洲天堂2020 | 欧美丰满一区二区免费视频 | 欧美 日韩 综合 | 波多野结衣三级视频 | 五月天一区二区三区 | 97超碰免费在线观看 | 一级片免费在线观看 | 热热热av| 三上悠亚在线一区 | 观看av在线 | 日韩黄色片 | 丝袜淫脚 | 久久精品国产99精品国产亚洲性色 | 蜜桃视频一区二区三区在线观看 | 中文字幕婷婷 | 亚洲午夜精品一区二区三区他趣 | 三级黄色图片 | 国产片天天弄 | 丰满岳乱妇在线观看中字无码 | 美女露出粉嫩尿囗让男人桶 | 天天射日日射 | 激情在线视频 | 黄色av网站免费看 | 中文天堂在线播放 | 高清不卡一区 | 骚婷婷 |