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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Statement

發(fā)布時間:2025/7/14 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Statement 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目大意

給定一棵基環(huán)外向樹,和若干組詢問,對于每次獨立的詢問都指定一些起點和一些終點,你刪去一些邊,使得從任意起點出發(fā)都無法到達(dá)終點,并讓刪去的邊的編號的最小值最大,求這個最大的最小值。

?

題解

不難發(fā)現(xiàn),在基環(huán)外向樹中,任意兩個點之間至多有唯一條簡單路徑,且對于這道題來講非簡單路徑是沒有意義的,因為非簡單路徑一定會囊括一個簡單路徑。這意味著對于每一個終點,至多有一個與之對應(yīng)的距離最短的起點,使得當(dāng)你將這條路徑上某一條邊刪掉時,這個起點就不可能被到達(dá)了。那么我們顯然會貪心的刪去路徑上編號最大的那一條。由于每一個點的入邊(如果有的話)是唯一的,且沒有修改操作,我們就可以用倍增來求路徑最大值。

現(xiàn)在問題就轉(zhuǎn)化為如何找每個重點對應(yīng)的起點,我們分開考慮。

先考慮起點僅通過樹邊到達(dá)終點的情況。這個比較好辦,將所有起點按照深度從小到大依次處理,每次把當(dāng)前起點的深度當(dāng)做標(biāo)記覆蓋到以這一起點所代表的的子樹中,這個用線段樹處理即可。做完這件事以后,掃一遍終點,如果它已經(jīng)被覆蓋到了,那么就通過標(biāo)記和深度直接算出起點和終點的距離,倍增求一下最大值,最終答案取$\min$,然后把這個終點刪掉即可。

剩下的終點一定滿足沒有一個起點能夠僅通過樹邊到達(dá),所以必須通過一部分環(huán)上的邊,因而不在環(huán)上的起點也沒用了,刪掉即可。我們直接讓剩下的終點先跳到它們所在的樹的樹根上,并在路徑上的邊求編號的$\max$,如果樹根不在環(huán)上或樹根所在的環(huán)上沒有任何起點,那么這個中點本身就不可被任何起點到達(dá),對答案沒有貢獻(xiàn)。然后對于每一個環(huán),將起點和終點都按照順時針排序,枚舉每一個終點都一定能找到它的前驅(qū)起點,更新答案即可。

復(fù)雜度$O(N+\sum\limits_{i=1}^{m} (t_i+f_i)\log N)$

?

#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #define LL long long #define M 200020 #define mid ((l+r)>>1) using namespace std; const int BufferSize=1<<19; char buffer[BufferSize],*head,*tail; inline char Getchar() {if(head==tail) {int l=fread(buffer,1,BufferSize,stdin);tail=(head=buffer)+l;} return *head++; } int read(){int nm=0,fh=1; char cw=Getchar();for(;!isdigit(cw);cw=Getchar()) if(cw=='-') fh=-fh;for(;isdigit(cw);cw=Getchar()) nm=nm*10+(cw-'0');return nm*fh; } int n,m,fs[M],fa[M][19],t[M][19],tmp=1,dfn[M],sz[M],od[M],to[M],nt[M]; int cnt,id[M],dep[M],tg[M<<2],maxn,tp[M],CT[M]; int S1[M],S2[M],C1[M],C2[M]; bool cir[M],vis[M],ist[M]; void link(int x,int y){nt[tmp]=fs[x],fs[x]=tmp,to[tmp++]=y;} void dfs(int x){sz[x]=1,dfn[x]=++cnt,vis[x]=true;for(int i=fs[x];i!=-1;i=nt[i]){if(cir[to[i]]) continue; id[to[i]]=id[x];dep[to[i]]=dep[x]+1,tp[to[i]]=tp[x];dfs(to[i]),sz[x]+=sz[to[i]];} } bool cmpd(int x,int y){return dep[x]<dep[y];} bool cmpc(int x,int y){if(id[tp[x]]!=id[tp[y]]) return id[tp[x]]<id[tp[y]];return od[tp[x]]>od[tp[y]];} void pushdown(int x){if(tg[x]!=-1) tg[x<<1]=tg[x<<1|1]=tg[x],tg[x]=-1;} void upd(int x,int l,int r,int L,int R,int D){if(r<L||R<l) return;if(L<=l&&r<=R){tg[x]=D;return;}pushdown(x),upd(x<<1,l,mid,L,R,D),upd(x<<1|1,mid+1,r,L,R,D); } int qry(int x,int l,int r,int pos){if(l==r) return tg[x]; pushdown(x);if(pos<=mid) return qry(x<<1,l,mid,pos); return qry(x<<1|1,mid+1,r,pos); } int dp(int x,int dt){int res=0;for(int k=0;dt>0;k++,dt>>=1) if(dt&1) res=max(res,t[x][k]),x=fa[x][k];return !res?m+1:res; } int main(){n=read(),m=read(),memset(fs,-1,sizeof(fs));for(int i=1;i<=m;i++){int u=read(),v=read();fa[v][0]=u,t[v][0]=i,link(u,v);}for(int i=1;i<=n;i++){if(vis[i]) continue; int now;for(vis[now=i]=true;fa[now][0]&&!vis[fa[now][0]];now=fa[now][0]) vis[fa[now][0]]=true;if(!fa[now][0]){ist[now]=true,t[now][0]=0;id[now]=++maxn,tp[now]=now,dfs(now); continue;} for(maxn++;!cir[now];now=fa[now][0]){cir[now]=true,id[now]=maxn,tp[now]=now;od[fa[now][0]]=od[now]+1,CT[maxn]++;} dfs(now);for(now=fa[now][0];od[now]!=CT[maxn];now=fa[now][0]) dfs(now);}for(int k=1;k<19;k++){for(int i=1;i<=n;i++){fa[i][k]=fa[fa[i][k-1]][k-1];t[i][k]=max(t[i][k-1],t[fa[i][k-1]][k-1]);}}for(int Qs=read();Qs;--Qs){upd(1,1,n,1,n,-2);int now,m1=read(),m2,st=1,ed=1,ans=m+1,n1=0,n2=0,ps=1;for(int i=1;i<=m1;i++) S1[i]=read(); m2=read();for(int i=1;i<=m2;i++) S2[i]=read(); sort(S1+1,S1+m1+1,cmpd);for(int i=1;i<=m1;i++) upd(1,1,n,dfn[S1[i]],dfn[S1[i]]+sz[S1[i]]-1,dep[S1[i]]);for(int i=1;i<=m2;i++){if(!dep[S2[i]]){if(cir[tp[S2[i]]]) C2[++n2]=S2[i];continue;}int num=qry(1,1,n,dfn[S2[i]]),cst;if(num>=0) cst=dp(S2[i],dep[S2[i]]-num),ans=min(ans,cst);else C2[++n2]=S2[i];}for(int i=1;i<=m1;i++) if(cir[S1[i]]) C1[++n1]=S1[i];sort(C1+1,C1+n1+1,cmpc),sort(C2+1,C2+n2+1,cmpc),C1[n1+1]=C2[n2+1]=0;for(int i=1;i<=n2;i++){while(ed<n1&&id[C1[st]]<id[tp[C2[i]]]) st=ed+1,ed=ps=st;if(id[C1[st]]<id[tp[C2[i]]]) break;if(id[C1[st]]>id[tp[C2[i]]]) continue;while(ed<n1&&id[C1[st]]==id[C1[ed+1]]) ed++;now=cir[C2[i]]?0:dp(C2[i],dep[C2[i]]),C2[i]=tp[C2[i]];while(ps<ed&&od[C1[ps+1]]>od[C2[i]]) ps++;if(od[C1[ps]]>od[C2[i]]) now=max(now,dp(C2[i],od[C1[ps]]-od[C2[i]]));else now=max(now,dp(C2[i],CT[id[C1[ps]]]+od[C1[ed]]-od[C2[i]]));if(now) ans=min(ans,now);}if(ans==m+1) puts("OK"); else printf("%d\n",ans);}return 0; }

?

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/OYJason/p/9728405.html

總結(jié)

以上是生活随笔為你收集整理的Statement的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产又爽又黄免费软件 | 日韩一区二区三区久久 | 成人综合站 | 天天干影院 | 日韩欧美高清在线视频 | 一区二区不卡视频在线观看 | 中国女人特级毛片 | 欧美精品一级二级 | 在线va视频 | 日韩精品免费一区二区 | 另类捆绑调教少妇 | 蜜臀av一区二区三区有限公司 | 日女人免费视频 | 色呦呦国产| japanese中文字幕 | 欧美zozo | 嫩草嫩草嫩草嫩草 | 亚洲天堂av网站 | 色拍拍视频| 91导航| 久久夜色精品国产噜噜亚洲av | 三级av网 | 97在线观看视频 | 99视频在线观看免费 | 国产精品色网 | 日韩电影第一页 | 人妻少妇久久中文字幕 | 成年人免费视频网站 | 中文字幕在线免费播放 | 法国性xxxx精品hd | 欧美资源 | 不卡av中文字幕 | 日韩av免费播放 | 国产一级免费观看 | 999久久久国产精品 韩国精品一区二区 | 天天做天天爱天天爽综合网 | 91在线免费观看网站 | 最近更新中文字幕 | 国产精品一区免费观看 | 老司机在线精品视频 | 中文av一区二区 | 天天艹天天 | 国产一极片 | 麻豆视频一区二区三区 | 国产卡一卡二卡三无线乱码新区 | 麻豆传媒网站入口 | 精品少妇人妻av一区二区三区 | 中文字幕色站 | 午夜视频观看 | 日本人三级 | 国产精品男女 | 欧美激情视频在线观看 | 精品国产一区二区三区久久久久久 | 日韩大片免费观看 | 香蕉免费在线视频 | 操一操干一干 | 欧类av怡春院 | 日本成人在线一区 | 三级黄色免费网站 | 日韩精品免费一区二区三区竹菊 | 美女啪啪一区二区 | 日韩1区| 亚洲一区不卡 | 国产欧美123| 美乳人妻一区二区三区 | 美女又黄又免费的视频 | 动漫美女被到爽 | 亚洲天堂一二三 | 黑人一区二区三区 | 真实的中国女人做爰 | 国产一卡在线 | 国产草草视频 | 亚洲第一色在线 | 一级坐爱片 | 久久久久国产精品无码免费看 | 久久成人激情 | 风流少妇按摩来高潮 | 日本中文字幕在线看 | a级片在线免费看 | 2019日韩中文字幕mv | 麻豆最新 | 色老头一区二区三区在线观看 | 亚洲bb | 伊人久久综合 | 婷婷视频 | 欧美日韩激情一区 | 少妇人妻真实偷人精品视频 | 欧美一区二区三区系列电影 | 国产一区免费在线观看 | 久热网站 | 草莓巧克力香氛动漫的观看方法 | 欧美综合亚洲图片综合区 | 亚洲两性 | 性色av蜜臀av浪潮av老女人 | 日韩一级黄色片 | 成人午夜精品视频 | 亚洲AV无码成人精品区麻豆 | 蜜桃久久精品 | 亚洲自拍av在线 |