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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

bzoj1095: [ZJOI2007]Hide 捉迷藏 动态点分治学习

發布時間:2025/7/14 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj1095: [ZJOI2007]Hide 捉迷藏 动态点分治学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

好迷啊。。。感覺動態點分治就是個玄學,蜜汁把樹的深度縮到logn

(靜態)點分治大概是遞歸的時候分類討論:

  1.答案經過當前點,暴力(霧)算

  2.答案不經過當前點,繼續遞歸

由于原樹可以長的奇形怪狀(菊花啊、、鏈啊、、掃把啊、、)這就導致各種方法都會被卡

于是通過每次找重心保證最大深度

動態怎么解決呢?

不妨考慮線段樹是二分的固態版本(只可意會),那么我們把每次找到的重心固定下來長成一棵樹就可以把點分治凝固(不可言傳)

原來點分治該維護什么現在就維護什么。。。

(事實上我并沒有寫過靜態點分治。。。好氣啊╮(╯▽╰)╭)

我居然一度認為新建的樹的節點要連到所在子樹外一定要經過該子樹的根。。。太思博了

實現細節:

  1.有一個帶刪堆,直接拉了板子(拉了才知道實現那么簡單,本來以為手打)

  2.lca以前習慣rmq(復雜度優異就是自信),現在改成倍增了(可能是之前寫了個長鏈剖分的緣故)

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int Mn=100005; 4 int cnt=0,h[Mn],n,m,vst[Mn],maxx,tg,s[Mn],sz,prt[Mn]; 5 int d[Mn],p[Mn][21],co[Mn]; 6 struct Priority_Queue{ 7 priority_queue<int> q,del; 8 void push(int x) 9 {q.push(x);} 10 void erase(int x){del.push(x);} 11 int top() 12 { 13 while(del.size()&&del.top()==q.top()) 14 {del.pop();q.pop();} 15 return q.top(); 16 } 17 void Pop() 18 { 19 while(del.size()&&del.top()==q.top()) 20 del.pop(),q.pop(); 21 q.pop(); 22 } 23 int sec_top() 24 { 25 int tmp=top();Pop(); 26 int se=top();push(tmp); 27 return se; 28 } 29 int size() 30 { 31 return q.size()-del.size(); 32 } 33 }c[Mn],f[Mn],ans; 34 struct Edge{int to,next;}w[Mn*2]; 35 void add(int x,int y) 36 {w[++cnt]=(Edge){y,h[x]};h[x]=cnt;} 37 void build(int x,int fa) 38 { 39 p[x][0]=fa;d[x]=d[fa]+1; 40 for(int i=1;p[x][i-1];i++) 41 p[x][i]=p[p[x][i-1]][i-1]; 42 for(int i=h[x];i;i=w[i].next) 43 if(w[i].to!=fa) 44 build(w[i].to,x); 45 } 46 void Insert(Priority_Queue &s){ 47 if(s.size()>1)ans.push(s.top()+s.sec_top()); 48 } 49 void Erase(Priority_Queue &s){ 50 if(s.size()>1)ans.erase(s.top()+s.sec_top()); 51 } 52 void DP(int x,int fa) 53 { 54 int j,y;s[x]=1; 55 for(j=h[x];j;j=w[j].next) 56 { 57 y=w[j].to; 58 if(y==fa||vst[y])continue; 59 DP(y,x); 60 s[x]+=s[y]; 61 } 62 } 63 void Biggest(int x,int fa){ 64 int j,y,mx=0; 65 for(j=h[x];j;j=w[j].next){ 66 y=w[j].to; 67 if(y==fa||vst[y])continue; 68 Biggest(y,x); 69 mx=max(mx,s[y]); 70 } 71 if(maxx>max(mx,sz-s[x])){ 72 maxx=max(mx,sz-s[x]); 73 tg=x; 74 } 75 } 76 int gg(int x)//get G 77 { 78 maxx=n+1;tg=0; 79 DP(x,0); 80 sz=s[x]; 81 Biggest(x,0); 82 return tg; 83 } 84 int LCA(int x,int y){ 85 int j; 86 if(d[x]<d[y])swap(x,y); 87 for(j=20;j>=0;j--) 88 if(d[p[x][j]]>=d[y])x=p[x][j]; 89 if(x==y)return x; 90 for(j=20;j>=0;j--) 91 if(p[x][j]!=p[y][j]) 92 {x=p[x][j];y=p[y][j];} 93 return p[x][0]; 94 } 95 int Dis(int x,int y){return d[x]+d[y]-2*d[LCA(x,y)];} 96 void work(int x,int fa,int Gra){ 97 int j,y; 98 f[Gra].push(Dis(x,prt[Gra])); 99 for(j=h[x];j;j=w[j].next){ 100 y=w[j].to; 101 if(y==fa||vst[y])continue; 102 work(y,x,Gra); 103 } 104 } 105 int mzz(int x,int fa) 106 { 107 int j,y,G,Gy; 108 G=gg(x);prt[G]=fa; 109 work(G,0,G); 110 vst[G]=1; 111 c[G].push(0); 112 for(j=h[G];j;j=w[j].next) 113 { 114 y=w[j].to; 115 if(!vst[y]){ 116 Gy=mzz(y,G); 117 c[G].push(f[Gy].top()); 118 } 119 } 120 Insert(c[G]); 121 return G; 122 } 123 void Light(int x){ 124 Erase(c[x]); 125 c[x].erase(0); 126 Insert(c[x]); 127 for(int y=x;prt[y];y=prt[y]){ 128 Erase(c[prt[y]]); 129 if(f[y].size())c[prt[y]].erase(f[y].top()); 130 f[y].erase(Dis(x,prt[y])); 131 if(f[y].size())c[prt[y]].push(f[y].top()); 132 Insert(c[prt[y]]); 133 } 134 } 135 void LiOut(int x){ 136 Erase(c[x]); 137 c[x].push(0); 138 Insert(c[x]); 139 for(int y=x;prt[y];y=prt[y]){ 140 Erase(c[prt[y]]); 141 if(f[y].size())c[prt[y]].erase(f[y].top()); 142 f[y].push(Dis(x,prt[y])); 143 if(f[y].size())c[prt[y]].push(f[y].top()); 144 Insert(c[prt[y]]); 145 } 146 } 147 void solve(){ 148 int i,x;char ch[5]; 149 cnt=n; 150 scanf("%d",&m); 151 for(i=1;i<=m;i++){ 152 scanf("%s",ch); 153 if(ch[0]=='G'){ 154 if(cnt<=1)printf("%d\n",cnt-1); 155 else printf("%d\n",ans.top()); 156 } 157 else{ 158 scanf("%d",&x); 159 if(!co[x]){cnt--;Light(x);co[x]=1;} 160 else{cnt++;LiOut(x);co[x]=0;} 161 } 162 } 163 } 164 int main() 165 { 166 scanf("%d",&n);int x,y; 167 for(int i=1;i<n;i++) 168 scanf("%d%d",&x,&y), 169 add(x,y),add(y,x); 170 build(1,0);mzz(1,0); 171 solve(); 172 return 0; 173 }

?

轉載于:https://www.cnblogs.com/wanglichao/p/6885797.html

總結

以上是生活随笔為你收集整理的bzoj1095: [ZJOI2007]Hide 捉迷藏 动态点分治学习的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产精品情侣自拍 | 成人激情五月天 | 欧美特级aaa| 韩国女主播裸体摇奶 | 男生坤坤放进女生坤坤里 | 91免费观看网站 | 五月综合色| 国产v亚洲v天堂无码久久久 | 色婷婷综合成人 | 草草福利影院 | 国产精品久久久久久久久久久久久久久久久久 | 欧美亚洲成人网 | 久久人精品 | xxxxx日韩| 亚洲中文字幕无码av永久 | 无码人妻一区二区三区在线 | 麻豆chinese极品少妇 | 河北彩花av在线播放 | 日本aⅴ在线 | www..com黄色| 日韩高清欧美 | 欧美人妖另类 | 福利片网址 | 免费看的黄色 | 亚洲欧洲自拍偷拍 | 亚洲综合性| 中文字幕在线观看视频一区二区 | 黄色av网站网址 | 3d成人动漫在线观看 | 久久免费黄色 | 久久久久久亚洲av无码专区 | 亚洲人一区二区三区 | 2019国产在线 | 17c在线 | 午夜免费一区二区 | 久久精品1| 日本天堂网 | 欧美啪啪网 | 久久99热这里只有精品 | 幸福宝在线观看 | 国产精品视频久久久久久久 | 欧美美女网站 | 国产无遮挡呻吟娇喘视频 | a一级视频 | 男女黄床上色视频 | 插久久 | 亚洲欧美国产一区二区三区 | 免费在线观看一区二区 | 久久99精品久久久久久 | 99精品人妻少妇一区二区 | 美女av一区二区 | 一本高清dvd在线播放 | 亚洲av无码专区在线播放中文 | 国产人妻人伦精品1国产盗摄 | 校园春色综合网 | 国产精品一二三四五 | 特种兵之深入敌后高清全集免费观看 | 欧美综合在线观看 | 精品一卡二卡三卡 | 91国产丝袜播放在线 | 窝窝在线视频 | 久久久久久久无码 | 激情影院内射美女 | 中文不卡av| 95久久| 欧美黑人精品一区二区 | 国产欧美精品aaaaaa片 | 18成人免费观看网站下载 | 亚洲精品欧洲精品 | 国内免费毛片 | 国产精品国产三级国产aⅴ9色 | 插插插干干干 | 99精品免费在线观看 | 精品在线视频一区二区 | 色综合一区二区三区 | 青青草草视频 | 日剧再来一次第十集 | 人日人视频 | 91影院在线播放 | av集中营 | 久久综合久久综合久久综合 | sese视频在线观看 | 91中文字幕在线观看 | 日本欧美在线观看 | 国产欧美在线观看不卡 | 国产精品一区二 | 久久久精品美女 | 亚洲图片一区二区三区 | 公与妇乱理三级xxx www色 | 日本午夜激情视频 | 欧美丝袜一区二区三区 | 国产精品88 | 国产精品 日韩 | 久久精品成人一区二区三区蜜臀 | 国产91丝袜在线观看 | 91免费观看视频在线 | 久久大胆视频 | 青青青视频在线播放 | 免费黄色一级 |