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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

洛谷P2056:[ZJOI2007]捉迷藏(点分树、STL)

發(fā)布時(shí)間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷P2056:[ZJOI2007]捉迷藏(点分树、STL) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

解析

見到動(dòng)態(tài)維護(hù)最遠(yuǎn)點(diǎn)對(duì),不難想到利用 set 維護(hù)最大值和次大值,每個(gè)點(diǎn)維護(hù)兩個(gè) set 的雜技做法。
但是問題是…T了啊。
咋辦嘞。

一個(gè)在本題至關(guān)重要的 trick:利用兩個(gè)堆來支持訪問最大值和刪除
具體也很好理解:當(dāng)刪除的時(shí)候,就向第二個(gè)堆 push 一個(gè)刪除元素,每次訪問的時(shí)候先把原堆和刪除堆堆頂一樣的元素彈掉即可。
支持了刪除,剩下的就簡(jiǎn)單了。

代碼

#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define OK printf("ok\n") #define debug(...) fprintf(stderr,__VA_ARGS__) inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; } const int N=2e5+100; const int inf=1e9+100; int n,m; struct node{int to,nxt; }p[N<<1]; int fi[N],cnt; inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return; } int dep[N],q[N<<1],tot,pl[N]; void dfs0(int x,int f){dep[x]=dep[f]+1;q[++tot]=x;pl[x]=tot;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f) continue;dfs0(to,x);q[++tot]=x;}return; } int Min(int x,int y){return dep[x]<dep[y]?x:y; } int lg[N<<1],mn[N<<1][20],mi[20]; void init(){dfs0(1,0);lg[0]=-1;for(int i=1;i<=tot;i++) lg[i]=lg[i>>1]+1;mi[0]=1;for(int i=1;i<=lg[tot];i++) mi[i]=mi[i-1]<<1;for(int i=1;i<=tot;i++) mn[i][0]=q[i];for(int k=1;k<=lg[tot];k++){for(int i=1;i+mi[k]-1<=tot;i++) mn[i][k]=Min(mn[i][k-1],mn[i+mi[k-1]][k-1]);}return; } inline int Lca(int x,int y){x=pl[x];y=pl[y];if(x>y) swap(x,y);int k=lg[y-x+1];//printf(" k=%d\n",k);return Min(mn[x][k],mn[y-mi[k]+1][k]); } inline int Dis(int x,int y){int lca=Lca(x,y);//printf("(%d %d) lca=%d dis=%d\n",x,y,lca,dep[x]+dep[y]-2*dep[lca]);return dep[x]+dep[y]-2*dep[lca]; } vector<int>f[2][N]; int w[N],top[N]; int rt,mnn,siz[N],S,son[N]; bool vis[N]; int o; void findrt(int x,int f){siz[x]=1;son[x]=0;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f||vis[to]) continue;findrt(to,x);siz[x]+=siz[to];son[x]=max(son[x],siz[to]);}son[x]=max(son[x],S-siz[x]);if(mnn>son[x]){mnn=son[x];rt=x;}return; } int tim; int solve(int x,int nS){//if(tim%1000==0) debug("%d\n",x);//printf("??\n");S=nS;mnn=inf;findrt(x,0);x=rt;vis[x]=1;siz[x]=nS+1;f[0][x].resize(siz[x]+1);f[1][x].resize(siz[x]+1);for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(vis[to]) continue;int tmp=solve(to,nS-son[to]);top[tmp]=x;}return x; } struct Set{priority_queue<int>q,d;inline bool empty(){return q.size()==d.size();}inline int size(){return q.size()-d.size();}inline void upd(){while(!d.empty()&&q.top()==d.top()) q.pop(),d.pop();}inline int top(){ upd();return q.top();}inline void del(int x){d.push(x);return;}inline void pop(){upd();q.pop();} inline void ins(int x){q.push(x);return;}inline int sec(){upd();int x=top();pop();int y=top();ins(x);return y;} }; Set s0[N],s1[N],ans; inline int calc(int x){return s0[x].top()+s0[x].sec(); } void ins(int x,int w){if(s0[x].size()>=2) ans.del(calc(x));s0[x].ins(w);if(s0[x].size()>=2) ans.ins(calc(x));return; } void era(int x,int w){if(s0[x].size()>=2) ans.del(calc(x));s0[x].del(w);if(s0[x].size()>=2) ans.ins(calc(x));return; } int op[N],num; void add(int x){++num;//printf("\nadd:%d\n",x);ins(x,0);for(int i=x;top[i];i=top[i]){if(!s1[i].empty()) era(top[i],s1[i].top());s1[i].ins(Dis(x,top[i]));ins(top[i],s1[i].top());}return; } void del(int x){--num;era(x,0);for(int i=x;top[i];i=top[i]){era(top[i],s1[i].top());s1[i].del(Dis(x,top[i]));if(!s1[i].empty()) ins(top[i],s1[i].top());}return; } signed main(){ #ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout); #endifmemset(fi,-1,sizeof(fi));cnt=-1;n=read();for(int i=1;i<n;i++){int x=read(),y=read();addline(x,y);addline(y,x);}init(); solve(1,n);//for(int i=1;i<=n;i++) printf("i=%d top=%d\n",i,top[i]);for(int i=1;i<=n;i++) add(i);m=read();char c;for(int i=1;i<=m;i++){scanf(" %c",&c);if(c=='G'){if(!ans.empty()) printf("%d\n",ans.top());else if(num) printf("0\n");else printf("-1\n");}else{int x=read();if(op[x]) add(x);else del(x);op[x]^=1;}}return 0; } /* */

總結(jié)

以上是生活随笔為你收集整理的洛谷P2056:[ZJOI2007]捉迷藏(点分树、STL)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产5区| 国产极品久久久 | 韩国一级淫片免费看 | 亚洲色图美腿丝袜 | 中文字幕在线免费视频 | 欧美特级黄色大片 | 综合久久一区 | 日本久久久网站 | 国产成人精品一区二区三区在线观看 | 久久久久xxxx | 2022av视频 | 欧美精品xxx | 亚洲高清免费观看 | 亚洲福利| 日本jizzjizz| 国产女人高潮视频 | 婷婷色一区二区三区 | av影视天堂 | 日韩欧美麻豆 | 老太脱裤让老头玩ⅹxxxx | 女女同性女同一区二区三区九色 | 性xxxx欧美老肥妇牲乱 | 天天操天天干天天摸 | 国产二区精品 | 国产一精品一aⅴ一免费 | 四虎影| 午夜精品电影 | 日韩精品在线免费观看视频 | 欧美亚洲综合久久 | 中文字幕一区二区人妻电影 | 日韩精品一区二区三区中文字幕 | 老地方在线观看免费动漫 | 国产黑丝一区 | 综合网久久 | 欧美视频一区在线 | 欧美激情图 | 国产xxxx孕妇 | 国产乱妇4p交换乱免费视频 | 午夜福利视频合集1000 | 日韩毛片网站 | 性欧美一区二区三区 | 国产成人精品无码免费看在线 | 婷婷色小说 | 色婷婷丁香 | www毛片com| 亚洲一区二区三区久久 | 亚洲成人黄色小说 | 激情五月婷婷小说 | 美女网站全黄 | 久久精品国产亚洲av嫖农村妇女 | 日本中文有码 | 羞羞漫画在线播放 | 久久久噜噜噜久久 | 美女被揉胸视频 | 日本特黄特黄刺激大片 | 国产在线精品福利 | 伊人97| 午夜日韩电影 | 欧美性xxxxxx| av在线网址观看 | 精品国产第一页 | 日本艳妇 | 男生女生羞羞网站 | 国产女人呻吟高潮抽搐声 | av在线不卡一区 | 亚洲精华国产精华精华液网站 | 日韩精品免费一区二区夜夜嗨 | 日韩在线观看网站 | 国产传媒视频在线 | 毛片日韩 | 国产一区二区久久 | 草久久免费视频 | 国产经典毛片 | 好av| 看个毛片| 久久久涩 | 黄色大片网址 | 日韩精品一区二区三区无码专区 | 精品无码久久久久久久久成人 | 国产日韩欧美在线观看视频 | 香蕉av一区二区 | 日韩欧美一区二区三区在线观看 | av在线看片| 水蜜桃影库 | 黑白配高清国语在线观看 | 国产精品久久亚洲7777 | 91大尺度 | 国产伦精品一区二区三区妓女 | 日韩视频免费观看高清 | 91精品在线视频观看 | 国产老头户外野战xxxxx | 精品亚洲国产成人av制服丝袜 | 蜜桃视频一区二区 | 日韩三级a | a级小视频| 男人手机天堂 | 天天网综合 | 免费av网站在线观看 | 外国av网站 |