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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【BZOJ-2325】道馆之战 树链剖分 + 线段树

發布時間:2024/10/12 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BZOJ-2325】道馆之战 树链剖分 + 线段树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2325: [ZJOI2011]道館之戰

Time Limit:?40 Sec??Memory Limit:?256 MB
Submit:?1153??Solved:?421
[Submit][Status][Discuss]

Description

口袋妖怪(又名神奇寶貝或寵物小精靈)紅/藍/綠寶石中的水系道館需要經過三個冰地才能到達館主的面前,冰地中的每一個冰塊都只能經過一次。當一個冰地上的所有冰塊都被經過之后,到下一個冰地的樓梯才會被打開。三個冰地分別如下: 當走出第三個冰地之后,就可以與館主進行道館戰了。館主發現這個難度太小,導致經常有挑戰者能通過,為了加大難度,將道館分成了n個房間,每個房間中是兩個冰塊或障礙,表示一列冰地。任意兩個房間之間均有且僅有一條路徑相連,即這n個房間構成一個樹狀結構。每個房間分成了A和B兩個區域,每一區域都是一個薄冰塊或者障礙物。每次只能移動到相鄰房間的同一類區域(即若你現在在這個房間的A區域,那么你只能移動到相鄰房間的A區域)或這個房間的另一區域。現在挑戰者從房間u出發,館主在房間v,那么挑戰者只能朝接近館主所在房間的方向過去。一開始挑戰者可以在房間u的任意一個冰塊區域內。如果挑戰者踩過的冰塊數達到了最大值(即沒有一種方案踩過的冰塊數更多了),那么當挑戰者走到最后一個冰塊上時,他會被瞬間傳送到館主面前與館主進行道館戰。自從館主修改規則后已經經過了m天,每天要么是有一個挑戰者來進行挑戰,要么就是館主將某個房間進行了修改。對于每個來的挑戰者,你需要計算出他若要和館主進行戰斗需要經過的冰塊數。

Input

第一行包含兩個正整數n和m。第2行到第n行,每行包含兩個正整數x和y,表示一條連接房間x和房間y的邊。房間編號為1…n。接下來n行,每行包含兩個字符。第n + k行表示房間k的兩個區域,第一個字符為A區域,第二個字符為B區域。其中“.”(ASCII碼為46)表示是薄冰塊,“#”(ASCII碼為35)表示是障礙物。最后的m行,每行一個操作: l C u s:將房間u里的兩個區域修改為s。 l Q u v:詢問挑戰者在房間u,館主在房間v時,挑戰者能與館主進行挑戰需要踩的冰塊數。如果房間u的兩個區域都是障礙物,那么輸出0。 N≤ 30 000 M ≤ 80 000

Output

包含若干行,每行一個整數。即對于輸入中的每個詢問,依次輸出一個答案。

Sample Input

5 3
1 2
2 3
2 4
1 5
.#
..
#.
.#
..
Q 5 3
C 1 ##
Q 4 5

Sample Output

6
3

HINT

Source

Day2

Solution

樹鏈剖分+線段樹維護(類似)連通性。 ?和 堵塞的交通 維護方法類似。但是并沒有做過。

題目大意:每個節點分為ab連個塊,這些節點之間聯通呈樹形,每個節點的ab可能為障礙或者是空地,從一個節點上的a可以到這個節點的b,或者和這個節點聯通的所有a(前提是路徑上無障礙)。詢問節點x到節點y的方向上最多走多少步,支持單點修改.

這樣如果是鏈上的情況,可以等價為一個2*N的矩陣,上面一行表示所有的a,下面一行表示所有的b,等效到樹上,就是多個2*1個矩陣連成的樹。

維護方法就是,對于一個區間,維護8個量分別表示:

dis[0][0]表示從區間左端點上到右端點上,dis[0][1]表示從區間左端點下到右端點上,dis[1][0]表示從區間左端點上到右端點下,dis[1][1]表示從區間左端點下到右端點下
Dis[0][0]表示從區間左端點上最多移動數,Dis[0][1]表示從區間左端點下最多移動數,Dis[1][0]表示從區間右端點上最多移動數,Dis[1][1]表示從區間右端點下最多移動數

合并的時候就是討論一下,畫畫圖就可以得到。

有一個問題,在詢問路徑x-->y時,有一邊到LCA的路徑是從下到上的,所以在和另一邊路徑合并答案時要先反向,然后就可以了。

寫的時候要注意細節,這個在Codeing的時候由于思路清晰,寫的還是十分美觀的,就是斷斷續續自己 想+寫+調 搞了近兩個小時...(話說題意真是不清晰)

Code

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; inline int read() {int x=0; char ch=getchar(); while (ch<'0' || ch>'9') ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); return x; } #define MAXN 30010 #define INF 100000000 int N,M,id[MAXN]; char mp[MAXN][3]; namespace SegmentTree {struct SgtNode{int l,r,dis[2][2],Dis[2][2]; SgtNode() { l=0,r=0; memset(dis,0,sizeof(dis)); memset(Dis,0,sizeof(Dis)); }inline bool have() {return !dis[0][0] && !dis[0][1] && !dis[1][0] && !dis[1][1] && !Dis[0][0] && !Dis[0][1] && !Dis[1][0] && !Dis[1][1];}inline void rever() { swap(dis[0][1],dis[1][0]),swap(Dis[0][0],Dis[1][0]),swap(Dis[0][1],Dis[1][1]); } inline void modify(int a,int b){dis[0][0]=a? 1:-INF; Dis[0][0]=Dis[1][0]=a; dis[1][1]=b? 1:-INF; Dis[0][1]=Dis[1][1]=b;if (a && b) Dis[0][0]=Dis[0][1]=Dis[1][0]=Dis[1][1]=dis[0][1]=dis[1][0]=2;else dis[0][1]=dis[1][0]=-INF;}//單點修改時的賦值 }tree[MAXN<<2];// dis[0][0]表示從區間左端點上到右端點上,dis[0][1]表示從區間左端點下到右端點上,dis[1][0]表示從區間左端點上到右端點下,dis[1][1]表示從區間左端點下到右端點下// Dis[0][0]表示從區間左端點上最多移動數,Dis[0][1]表示從區間左端點下最多移動數,Dis[1][0]表示從區間右端點上最多移動數,Dis[1][1]表示從區間右端點下最多移動數 #define ls now<<1#define rs now<<1|1inline void update(SgtNode &rt,SgtNode lson,SgtNode rson){SgtNode tmp=rt;if (lson.have()) {rt=rson; rt.l=tmp.l; rt.r=tmp.r; return;} if (rson.have()) {rt=lson; rt.l=tmp.l; rt.r=tmp.r; return;}rt.dis[0][0]=max( max( lson.dis[0][0]+rson.dis[0][0] , lson.dis[0][1]+rson.dis[1][0] ) , -INF);rt.dis[0][1]=max( max( lson.dis[0][0]+rson.dis[0][1] , lson.dis[0][1]+rson.dis[1][1] ) , -INF);rt.dis[1][0]=max( max( lson.dis[1][0]+rson.dis[0][0] , lson.dis[1][1]+rson.dis[1][0] ) , -INF);rt.dis[1][1]=max( max( lson.dis[1][1]+rson.dis[1][1] , lson.dis[1][0]+rson.dis[0][1] ) , -INF);rt.Dis[0][0]=max( lson.Dis[0][0] , max( lson.dis[0][0]+rson.Dis[0][0] , lson.dis[0][1]+rson.Dis[0][1] ) );rt.Dis[0][1]=max( lson.Dis[0][1] , max( lson.dis[1][0]+rson.Dis[0][0] , lson.dis[1][1]+rson.Dis[0][1] ) );rt.Dis[1][0]=max( rson.Dis[1][0] , max( rson.dis[0][0]+lson.Dis[1][0] , rson.dis[1][0]+lson.Dis[1][1] ) );rt.Dis[1][1]=max( rson.Dis[1][1] , max( rson.dis[0][1]+lson.Dis[1][0] , rson.dis[1][1]+lson.Dis[1][1] ) );}inline void Update(int now) {update(tree[now],tree[ls],tree[rs]);}inline void Modify(int now,int pos,char MP[]){int l=tree[now].l,r=tree[now].r;if (l==r) {tree[now].modify(MP[1]=='.',MP[2]=='.'); return;}int mid=(l+r)>>1;if (pos<=mid) Modify(ls,pos,MP); else Modify(rs,pos,MP);Update(now);}inline SgtNode Query(int now,int L,int R){int l=tree[now].l,r=tree[now].r;if (l==L && R==r) return tree[now];int mid=(l+r)>>1; SgtNode ret;if (R<=mid) return Query(ls,L,R);else if (L>mid) return Query(rs,L,R);else return update(ret,Query(ls,L,mid),Query(rs,mid+1,R)),ret;}inline void Build(int now,int l,int r){tree[now].l=l; tree[now].r=r;if (l==r) return;int mid=(l+r)>>1;Build(ls,l,mid); Build(rs,mid+1,r);} } using namespace SegmentTree; namespace Divide {struct EdgeNode{int next,to;}edge[MAXN<<1];int head[MAXN],cnt=1;inline void AddEdge(int u,int v) {cnt++; edge[cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt;}inline void InsertEdge(int u,int v) {AddEdge(u,v); AddEdge(v,u);}int deep[MAXN],fa[MAXN],size[MAXN],son[MAXN],pl[MAXN],dfn,top[MAXN];inline void DFS_1(int now,int last){size[now]=1;for (int i=head[now]; i; i=edge[i].next)if (edge[i].to!=last){fa[edge[i].to]=now;deep[edge[i].to]=deep[now]+1;DFS_1(edge[i].to,now);size[now]+=size[edge[i].to];if (size[son[now]]<size[edge[i].to]) son[now]=edge[i].to;}}inline void DFS_2(int now,int chain){pl[now]=++dfn; top[now]=chain;if (son[now]) DFS_2(son[now],chain);for (int i=head[now]; i; i=edge[i].next)if (edge[i].to!=fa[now] && edge[i].to!=son[now])DFS_2(edge[i].to,edge[i].to);}inline void Modify(int pos,char MP[]) {SegmentTree::Modify(1,pl[pos],MP);}inline void GetAns(int x,int y){SgtNode la,ra,ans; ra.l=ra.r=1; la.l=la.r=1;while (top[x]!=top[y])if (deep[top[x]]<deep[top[y]]) update(ra,Query(1,pl[top[y]],pl[y]),ra),y=fa[top[y]];else update(la,Query(1,pl[top[x]],pl[x]),la),x=fa[top[x]];if (deep[x]<deep[y]) update(ra,Query(1,pl[x],pl[y]),ra);elseupdate(la,Query(1,pl[y],pl[x]),la);la.rever(); update(ans,la,ra);printf("%d\n",max(ans.Dis[0][0],ans.Dis[0][1]));}inline void BuildTree() {for (int i=1; i<=N; i++) Modify(i,mp[i]);} } using namespace Divide; int main() { // freopen("fight.in","r",stdin); freopen("fight.out","w",stdout);N=read(),M=read();for (int x,y,i=1; i<=N-1; i++) x=read(),y=read(),InsertEdge(x,y);Divide::DFS_1(1,0); Divide::DFS_2(1,1);for (int i=1; i<=N; i++) scanf("%s",mp[i]+1);SegmentTree::Build(1,1,N); Divide::BuildTree();while (M--){char opt[2],MP[3]; scanf("%s",opt); int L,R,p;switch (opt[0]){case 'Q' : L=read(),R=read(); Divide::GetAns(L,R); break;case 'C' : p=read(); scanf("%s",MP+1); Divide::Modify(p,MP); break;}}return 0; }

轉載于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5978653.html

總結

以上是生活随笔為你收集整理的【BZOJ-2325】道馆之战 树链剖分 + 线段树的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲一二三在线 | 亚洲天堂久久新 | 麻豆 美女 丝袜 人妻 中文 | 日本中文在线观看 | 亚洲中文字幕一区在线 | www.日日夜夜 | 少妇又色又爽又黄的视频 | 高清日韩一区二区 | 91视| 亚洲网站在线免费观看 | 好吊妞这里有精品 | 十大污视频 | 精品少妇一区二区三区免费观看 | 色撸撸av | 会喷水的亲姐姐 | 国产精品乱 | www麻豆视频| 福利在线网站 | av中文字幕免费观看 | av一级二级 | 色吧婷婷 | 日本一区二区三区精品视频 | 香蕉久久视频 | 五月激情综合 | 中国丰满老妇xxxxx交性 | 天天激情站 | 日韩欧美高清dvd碟片 | 91成人福利 | 99riav国产| 国产av电影一区二区三区 | 久久黑人 | 久草免费看 | 日韩毛片在线免费观看 | 男人天堂导航 | 毛片最新网址 | 五月婷婷丁香在线 | 国产又粗又黄又爽又硬的视频 | 久久影院午夜理论片无码 | 丰满人妻一区二区三区53 | 国产午夜精品理论片在线 | 国产免费观看久久黄av片 | 日韩在线视频播放 | 午夜免费av | 伊人免费视频二 | 欧美一区二区免费在线观看 | 欧美视频| 免费观看黄色小视频 | 精品无码一区二区三区免费 | 欧美日韩亚洲视频 | 精品欧美 | 亚洲高清视频在线观看 | 欧美伦理片| 久久天堂av | 日本人毛片 | 亚洲欧美成人一区二区 | 欧美亚洲一 | 草草影院国产 | 在线综合视频 | 男人天堂国产 | 色人人 | 激情丁香六月 | 67194成人| 青青视频免费观看 | 中文字幕一区二区人妻痴汉电车 | 久久乐国产精品 | 精品aaa| 91嫩草欧美久久久九九九 | 午夜私人福利 | 免费国偷自产拍精品视频 | 色婷婷av一区二区三 | 国产精品一区二区小说 | 国产在线97 | 91成人免费在线视频 | 90岁肥老奶奶毛毛外套 | 日韩一区二区三区高清 | 老司机午夜性大片 | 超碰公开在线观看 | 日本久热 | 狂野欧美性猛交免费视频 | 国产传媒一区二区三区 | 日韩精品1| 欧美一级黄色片视频 | 美国少妇性做爰 | 国产麻豆免费观看 | 黄色小视频在线免费观看 | www.av88| av无码av天天av天天爽 | 日韩黄色大全 | av网站免费大全 | 91成人精品国产刺激国语对白 | 欧美视频在线观看免费 | 欧美精品一区二区三区在线播放 | 日韩电影二区 | 97成人资源 | 欧洲一级片 | www.avcao| 亚洲手机看片 | 日韩av片在线播放 | 密臀av在线 |