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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

3991: [SDOI2015]寻宝游戏

發布時間:2023/12/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3991: [SDOI2015]寻宝游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

3991: [SDOI2015]尋寶游戲

Time Limit:?40 Sec??Memory Limit:?128 MB
Submit:?1025??Solved:?508
[Submit][Status][Discuss]

Description

?B最近正在玩一個尋寶游戲,這個游戲的地圖中有N個村莊和N-1條道路,并且任何兩個村莊之間有且僅有一條路徑可達。游戲開始時,玩家可以任意選擇一個村莊,瞬間轉移到這個村莊,然后可以任意在地圖的道路上行走,若走到某個村莊中有寶物,則視為找到該村莊內的寶物,直到找到所有寶物并返回到最初轉移到的村莊為止。小B希望評測一下這個游戲的難度,因此他需要知道玩家找到所有寶物需要行走的最短路程。但是這個游戲中寶物經常變化,有時某個村莊中會突然出現寶物,有時某個村莊內的寶物會突然消失,因此小B需要不斷地更新數據,但是小B太懶了,不愿意自己計算,因此他向你求助。為了簡化問題,我們認為最開始時所有村莊內均沒有寶物

Input

?第一行,兩個整數N、M,其中M為寶物的變動次數。

接下來的N-1行,每行三個整數x、y、z,表示村莊x、y之間有一條長度為z的道路。 接下來的M行,每行一個整數t,表示一個寶物變動的操作。若該操作前村莊t內沒有寶物,則操作后村莊內有寶物;若該操作前村莊t內有寶物,則操作后村莊內沒有寶物。

Output

?M行,每行一個整數,其中第i行的整數表示第i次操作之后玩家找到所有寶物需要行走的最短路程。若只有一個村莊內有寶物,或者所有村莊內都沒有寶物,則輸出0。

Sample Input

4 5
1 2 30
2 3 50
2 4 60
2
3
4
2
1

Sample Output

0
100
220
220
280

HINT

?1<=N<=100000


1<=M<=100000
對于全部的數據,1<=z<=10^9

Source

Round 1 感謝yts1999上傳

[Submit][Status][Discuss]



每次修改結束后,對于當前確定的關鍵點,全部拿出來做成虛樹

要使答案最優,肯定是虛樹上每條邊走兩邊,權值和就是答案了

其實可以這樣,把所有關鍵點按照dfs序排好,只要按照dfs序一個個走過去,最后走回來就行了

這樣隨便上一個什么數據結構就行了


茍蒻選了替罪羊樹。。。。假裝是為了學習刪除操作吧。。?結果弄了好久

替罪羊樹的刪除倒是挺奇葩,不會真的把節點抹去,而是給它打個標記,代表它已經不存在了

不過節點仍然存在樹中,只是查詢操作時不把它記入答案

當一個節點內已經被刪除的節點超過一半的時候,就把這個子樹暴力重建

復雜度仍然是均攤O(nlogn)

#include<iostream> #include<cstring> #include<vector> #include<algorithm> #include<cstdio> using namespace std;typedef double DB; typedef long long LL; const DB alpha = 0.666; const DB belta = 0.500; const int maxn = 1E5 + 10; const int T = 18;struct E{int to,w; E(){}E(int to,int w): to(to),w(w){} };int n,m,dfs_clock,rt,a,tp,cnt,ch[maxn][2],dfn[maxn],fa[maxn],L[maxn],stk[maxn],Fa[maxn][T],siz[maxn],sz[maxn]; LL Ans,dis[maxn]; bool bo[maxn],ext[maxn];vector <E> v[maxn];void Dfs(int x,int from) {dfn[x] = ++dfs_clock;for (int i = 1; i < T; i++) Fa[x][i] = Fa[Fa[x][i-1]][i-1];for (int i = 0; i < v[x].size(); i++){E e = v[x][i];if (e.to == from) continue;dis[e.to] = dis[x] + 1LL * e.w;L[e.to] = L[x] + 1; Fa[e.to][0] = x; Dfs(e.to,x);} }int maintain(const int &x) {sz[x] = ext[x] ? 0 : 1;sz[x] += sz[ch[x][0]] + sz[ch[x][1]];siz[x] = 1 + siz[ch[x][0]] + siz[ch[x][1]]; } bool Judge(const int &x) {return max(siz[ch[x][0]],siz[ch[x][1]]) >= alpha * (DB)(siz[x]) || sz[x] >= belta * (DB)(siz[x]);}void Insert(int &x,int y) {if (x == y) {ext[x] = 1; maintain(x); return;}if (!x){x = y; ext[x] = siz[x] = 1;ch[x][0] = ch[x][1] = 0; maintain(x); return;}int d = dfn[x] > dfn[y] ? 0 : 1;Insert(ch[x][d],y); fa[ch[x][d]] = x;maintain(x); if (Judge(x)) a = x; }void Remove(int x,int y) {if (x == y){ext[x] = 0; maintain(x);if (Judge(x)) a = x; return;}int d = dfn[x] > dfn[y] ? 0 : 1;Remove(ch[x][d],y); maintain(x);if (Judge(x)) a = x; }int Rank(int x,int y) {if (x == y) return siz[ch[x][0]] - sz[ch[x][0]] + ext[x];int d = dfn[x] > dfn[y] ? 0 : 1,ret = 0;if (d == 1) ret = (siz[ch[x][0]] - sz[ch[x][0]] + ext[x]);return ret + Rank(ch[x][d],y); }int Find(int x,int k) {int tmp = siz[ch[x][0]] - sz[ch[x][0]] + ext[x];if (ext[x] && tmp == k) return x;int d = tmp < k ? 1 : 0; if (d) k -= tmp;return Find(ch[x][d],k); }void Dfs2(int x) {if (!x) return; Dfs2(ch[x][0]);if (ext[x]) stk[++tp] = x; Dfs2(ch[x][1]); }int Build(int l,int r) {if (l > r) return 0;int mid = (l + r) >> 1,ret = stk[mid];ch[ret][0] = Build(l,mid-1);ch[ret][1] = Build(mid+1,r);for (int i = 0; i < 2; i++)if (ch[ret][i]) fa[ch[ret][i]] = ret;maintain(ret); return ret; }void Rebuild(int x) {tp = 0; Dfs2(x); int z = fa[x];int y = fa[x],now = Build(1,tp);if (x == rt) rt = now,fa[now] = 0;else {ch[y][ch[y][1] == x] = now; if (now) fa[now] = y;}while (z) maintain(z),z = fa[z]; }int LCA(int p,int q) {if (L[p] < L[q]) swap(p,q);for (int i = T - 1; i >= 0; i--)if (L[p] - (1<<i) >= L[q]) p = Fa[p][i];if (p == q) return p;for (int i = T - 1; i >= 0; i--)if (Fa[p][i] != Fa[q][i])p = Fa[p][i],q = Fa[q][i];return Fa[p][0]; } LL Dis(int x,int y) {return dis[x] + dis[y] - 2LL * dis[LCA(x,y)];}int getint() {char ch = getchar(); int ret = 0;while (ch < '0' || '9' < ch) ch = getchar();while ('0' <= ch && ch <= '9')ret = ret*10 + ch - '0',ch = getchar();return ret; }char s[20]; void Print(LL x) {int len = 0; while (x) s[++len] = x % 10LL,x /= 10LL;for (int i = len; i; i--) putchar(s[i] + '0'); puts(""); }int main() {#ifdef DMCfreopen("DMC.txt","r",stdin);freopen("test.txt","w",stdout);#endifn = getint(); m = getint();for (int i = 1; i < n; i++){int x = getint(),y,w;y = getint(); w = getint();v[x].push_back(E(y,w));v[y].push_back(E(x,w));}L[n / 2] = 1; Dfs(n / 2,0); dfn[n + 1] = -maxn; cnt = 2;Insert(rt,n + 1); dfn[n + 2] = maxn; Insert(rt,n + 2);while (m--){int x = getint(); bo[x] ^= 1;if (bo[x]){++cnt; a = 0; Insert(rt,x);if (cnt == 3) {puts("0"); continue;}if (a) Rebuild(a); int rk = Rank(rt,x);int A = rk > 2 ? Find(rt,rk - 1) : Find(rt,cnt - 1);int B = rk < cnt - 1 ? Find(rt,rk + 1) : Find(rt,2);Ans += (Dis(A,x) + Dis(B,x) - Dis(A,B)); Print(Ans);}else{if (cnt == 3){cnt = 2; Ans = 0; puts("0");Remove(rt,x); continue;}int rk = Rank(rt,x);int A = rk > 2 ? Find(rt,rk - 1) : Find(rt,cnt - 1);int B = rk < cnt - 1 ? Find(rt,rk + 1) : Find(rt,2);Ans += (Dis(A,B) - Dis(A,x) - Dis(B,x)); Print(Ans);a = 0; Remove(rt,x); if (a) Rebuild(a); --cnt;}}return 0; }

總結

以上是生活随笔為你收集整理的3991: [SDOI2015]寻宝游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 日韩精品一区二区三区不卡在线 | 男人添女人下部高潮全视频 | 天天干天天透 | 欧美特级黄色录像 | 91亚洲视频在线观看 | 欧美久久网 | 成人性免费视频 | 欧美 日韩 国产 成人 在线观看 | 裸体裸乳免费看 | 老熟妻内射精品一区 | 91麻豆精品在线观看 | 亚洲黄色中文字幕 | av在线看片 | 欧美成人午夜 | 国产成人精品亚洲男人的天堂 | 久章草在线观看 | 中文字幕视频免费 | 一级h片| 久草资源在线 | 人人看人人射 | av在线视屏 | 四虎免看黄 | 欧美在线视频精品 | 91精品免费在线观看 | 韩日视频在线观看 | 九九热视频免费 | 日韩美在线 | 精国产人伦一区二区三区 | 免费av观看网站 | 国产精品99久久久久久久 | 国内激情自拍 | a天堂在线视频 | 综合精品国产 | 国产乱码精品一品二品 | 国产一级片精品 | 猫咪av在线| 久久精品不卡 | 久久久久久久久99精品 | 国产片在线播放 | 综合色婷婷一区二区亚洲欧美国产 | 日本在线视频播放 | 狼友视频国产精品 | 高清无码视频直接看 | 亚洲人人爱 | 黄色日韩网站 | 欧美综合国产 | 日韩一级黄 | 五十路av| www.国产一区二区三区 | 亚洲一区动漫 | 免费在线国产视频 | 四虎在线影视 | 99在线免费观看 | 女优在线观看 | 亚洲国内自拍 | 欧美一区二区三区免费观看 | 日韩女同互慰一区二区 | a v在线视频 | 成人午夜免费福利视频 | 国产精品成人aaaaa网站 | 免费在线看黄网站 | 福利在线电影 | 伊人黄网| 免费一级片视频 | 伊人色综合久久天天 | 欧美一二三级 | 超碰爱爱 | 五月婷婷小说 | 亚洲欧美日韩精品久久 | 在线国产精品一区 | 日日操夜夜操狠狠操 | www男人的天堂 | 91久久国产综合久久91精品网站 | 国产黄色片免费 | 麻豆视频免费看 | 老妇裸体性猛交视频 | 91成人小视频 | 爱爱视频免费看 | 亚洲天堂av免费在线观看 | 国产l精品国产亚洲区久久 午夜青青草 | 91国内精品久久久久 | 亚洲欧美日韩综合一区二区 | 91成人看片 | 日本高清免费视频 | 久久91视频| 日韩美女爱爱 | 91性高潮久久久久久久 | www.色中色| 黄色羞羞网站 | 亚洲天堂久久 | 三级免费网址 | 黑人巨大精品欧美一区二区免费 | 超碰导航| 成人久久久精品国产乱码一区二区 | 午夜av网址| 性史性dvd影片农村毛片 | 国产区一区二区三区 | 欧美国产二区 | 打开免费观看视频在线播放 |